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的函数的一些高阶特性
Apr 27 Python
在Python操作时间和日期之asctime()方法的使用
May 22 Python
使用Python发送各种形式的邮件的方法汇总
Nov 09 Python
使用tensorflow实现AlexNet
Nov 20 Python
通过Python 获取Android设备信息的轻量级框架
Dec 18 Python
pandas 对每一列数据进行标准化的方法
Jun 09 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
python中threading开启关闭线程操作
May 02 Python
使用Django的JsonResponse返回数据的实现
Jan 15 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
php中实现简单的ACL 完结篇
2011/09/07 PHP
PHP字符串的编码问题的详细介绍
2013/04/27 PHP
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
php实现的顺序线性表示例
2019/05/04 PHP
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
js中的eventType事件及其浏览器支持性介绍
2013/11/29 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
JavaScript文件的同步和异步加载的实现代码
2017/08/19 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
javaScript中的空值和假值
2017/12/18 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
Python的函数的一些高阶特性
2015/04/27 Python
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
Python实现Mysql数据统计及numpy统计函数
2019/07/15 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
python3 使用traceback定位异常实例
2020/03/09 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
在教室放鞭炮的检讨书
2014/09/28 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书