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中dir函数用法分析
Apr 17 Python
python过滤字符串中不属于指定集合中字符的类实例
Jun 30 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
python使用 HTMLTestRunner.py生成测试报告
Oct 20 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
python smtplib模块自动收发邮件功能(一)
May 22 Python
对pandas数据判断是否为NaN值的方法详解
Nov 06 Python
如何基于python实现脚本加密
Dec 28 Python
python super函数使用方法详解
Feb 14 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
Oct 22 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 Python
用Python将GIF动图分解成多张静态图片
Jun 11 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/03/04 星际争霸
Sony CFR 320 修复改造
2020/03/14 无线电
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
JavaScipt中栈的实现方法
2016/02/17 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
2020/07/15 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
Python中static相关知识小结
2018/01/02 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
python编写一个会算账的脚本的示例代码
2020/06/02 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
zooplus德国:便宜地订购动物用品、动物饲料、动物食品
2020/05/06 全球购物
写给女朋友的道歉信
2014/01/12 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
班主任班级寄语大全
2014/04/04 职场文书
2014年文员工作总结
2014/11/18 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL
AJAX实现省市县三级联动效果
2021/10/16 Javascript