Python使用sqlalchemy模块连接数据库操作示例


Posted in Python onMarch 13, 2019

本文实例讲述了Python使用sqlalchemy模块连接数据库操作。分享给大家供大家参考,具体如下:

安装:

pip install sqlalchemy
# 安装数据库驱动:
pip install pymysql
pip install cx_oracle

举例:(在url后面加入?charset=utf8可以防止乱码)

from sqlalchemy import create_engine
engine=create_engine('mysql+pymysql://username:password@hostname:port/dbname', echo=True) #echo=True 打印sql语句信息

create_engine接受一个url,格式为:

# '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
# 常用的
engine = create_engine('sqlite:///:memory:', echo=True)   # sqlite内存
engine = create_engine('sqlite:///./cnblogblog.db',echo=True) # sqlite文件
engine = create_engine("mysql+pymysql://username:password@hostname:port/dbname",echo=True) # mysql+pymysql
engine = create_engine('mssql+pymssql://username:password@hostname:port/dbname',echo=True) # mssql+pymssql
engine = create_engine('postgresql://scott:tiger@hostname:5432/dbname') # postgresql示例
engine = create_engine('oracle://scott:tiger@hostname:1521/sidname') # oracle
engine = create_engine('oracle+cx_oracle://scott:tiger@tnsname') #pdb就可以用tns连接

简单demo:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base 
engine = create_engine('oracle://spark:a@orclpdb',echo=True) #echo要求打印sql语句等调试信息
session_maker = sessionmaker(bind=engine)
session = session_maker()
Base = declarative_base()
#对应一张表
class Student(Base): 
  __tablename__ = 'STUDENT'
  id = Column('STUID', Integer, primary_key=True)
  name = Column('STUNAME', String(32), nullable=False)
  age = Column('STUAGE', Integer)
  def __repr__(self):
    return '<Student(id:%s, name:%s, age:%s)>' % (self.id, self.name, self.age)
Base.metadata.create_all(engine) #若存在STUDENT表则不做,不存在则创建。
queryObject = session.query(Student).order_by(Student.id.desc())
for ins in queryObject:
  print(ins.id, ins.name, ins.age)
'''
4 hey 24
3 lwtxxs 27
2 gyb 89
1 ns 23
'''

将查询结果映射为DataFrame:

import pandas as pd
df = pd.read_sql(session.query(Student).filter(Student.id > 1).statement, engine) 
print(df)
'''
  STUID STUNAME STUAGE
0   4   hey   24
1   2   gyb   89
2   3 lwtxxs   27
'''

查询:

session的query方法除了可以接受Base子类对象作为参数外,还可以是字段,如:

query = session.query(Student.name, Student.age) # query为一个sqlalchemy.orm.query.Query对象
for stu_name, stu_age in query:
  print(stu_name, stu_age)

查询条件filter:

# = / like
query.filter(Student.name == 'wendy')
query.filter(Student.name.like('%ed%'))
# in
query.filter(Student.name.in_(['wendy', 'jack']))
query.filter(Student.name.in_(
    session.query(User.name).filter(User.name.like('%ed%'))
))
# not in
query.filter(~Student.name.in_(['ed', 'wendy', 'jack']))
# is null / is not null
query.filter(Student.name == None)
query.filter(Student.name.is_(None))
query.filter(Student.name != None)
query.filter(Student.name.isnot(None))
# and
from sqlalchemy import and_, or_
query.filter(and_(Student.name == 'ed', Student.age != 23))
query.filter(Student.name == 'ed', Student.age != 23)
query.filter(Student.name == 'ed').filter(Student.age != 23)
# or
query.filter(or_(Student.name == 'ed', Student.name == 'wendy'))
# match
query.filter(Student.name.match('wendy'))

Query的方法:

all()方法以列表形式返回结果集:

from sqlalchemy import or_, and_
queryObject = session.query(Student).filter(or_(Student.id == 1, Student.id == 2))
print(queryObject.all())  # [<Student(id:1, name:ns, age:23)>, <Student(id:2, name:gyb, age:89)>]
queryObject = session.query(Student.name).filter(or_(Student.id == 1, Student.id == 2))
print(queryObject.all())  # [('ns',), ('gyb',)]

first()方法返回单个结果。(若结果集为空则返回None)

print(queryObject.first())  # ('ns',)

one()方法返回单个结果,与first()方法不同的是:当结果集中没有元素或有多于一个元素会抛出异常。
one_or_none()方法同one()一样,不同是结果集为空则返回None,为多个抛出异常。

查询数量:

from sqlalchemy import func
session.query(func.count(Student.id)).scalar() # SELECT count("STUDENT"."STUID") AS count_1 FROM "STUDENT"

分组:

session.query(func.count(Student.id), Student.name).group_by(Student.name).all()

嵌套SQL语句:

from sqlalchemy import text
query = session.query(Student.id, Student.name).filter(text('stuid>2'))
query = session.query('stuid', 'stuname', 'stuage').from_statement(\
text("select * from student where stuname=:stuname")).params(stuname='hey').all()  #[(4, 'hey', 24)]

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python之wxPython应用实例
Sep 28 Python
Python中常用操作字符串的函数与方法总结
Feb 04 Python
python 全文检索引擎详解
Apr 25 Python
python3第三方爬虫库BeautifulSoup4安装教程
Jun 19 Python
详解pyenv下使用python matplotlib模块的问题解决
Nov 29 Python
Python pandas用法最全整理
Aug 04 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
python 数据分析实现长宽格式的转换
May 18 Python
python中字典增加和删除使用方法
Sep 30 Python
Python实现自动装机功能案例分析
Oct 22 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 Python
python运算符之与用户交互
Apr 13 Python
python ---lambda匿名函数介绍
Mar 13 #Python
Python实现的列表排序、反转操作示例
Mar 13 #Python
Python实现的调用C语言函数功能简单实例
Mar 13 #Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 #Python
浅谈python标准库--functools.partial
Mar 13 #Python
Python3实现的简单三级菜单功能示例
Mar 12 #Python
Python3实现的简单工资管理系统示例
Mar 12 #Python
You might like
2020年4月放送!《Princess Connect Re:Dive》制作组 & 角色声优公开!
2020/03/06 日漫
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
php 中文字符串首字母的获取函数分享
2013/11/04 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
jQuery的框架介绍
2016/05/11 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
2020/12/03 Javascript
python读取html中指定元素生成excle文件示例
2014/04/03 Python
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
Python File(文件) 方法整理
2019/02/18 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
HTML5的新特性(1)
2016/03/03 HTML / CSS
毕业生精彩的自我评价分享
2013/10/06 职场文书
委托书样本
2014/04/02 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
学生保证书
2015/01/16 职场文书
语文教师个人工作总结
2015/02/06 职场文书
辞职申请书范本
2019/05/20 职场文书
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL