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写的一个squid访问日志分析的小程序
Sep 17 Python
举例介绍Python中的25个隐藏特性
Mar 30 Python
Python使用zip合并相邻列表项的方法示例
Mar 17 Python
Python基于TCP实现会聊天的小机器人功能示例
Apr 09 Python
django初始化数据库的实例
May 27 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
opencv设置采集视频分辨率方式
Dec 10 Python
Python 判断时间是否在时间区间内的实例
May 16 Python
Python本地及虚拟解释器配置过程解析
Oct 13 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
Oct 21 Python
Django web自定义通用权限控制实现方法
Nov 24 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 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
Function eregi is deprecated (解决方法)
2013/06/21 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
动态控制Table的js代码
2007/03/07 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
vue 开发一个按钮组件的示例代码
2018/03/27 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
python的几种开发工具介绍
2007/03/07 Python
python为tornado添加recaptcha验证码功能
2014/02/26 Python
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
python连接mysql有哪些方法
2020/06/24 Python
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
财务会计实习报告体会
2013/12/20 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android