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使用socket远程连接错误处理方法
Apr 29 Python
Flask框架配置与调试操作示例
Jul 23 Python
python 2.7 检测一个网页是否能正常访问的方法
Dec 26 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 Python
python word转pdf代码实例
Aug 16 Python
Pytorch 实现自定义参数层的例子
Aug 17 Python
python 字符串常用函数详解
Sep 11 Python
python使用协程实现并发操作的方法详解
Dec 27 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
浅谈pycharm导入pandas包遇到的问题及解决
Jun 01 Python
python tkinter的消息框模块(messagebox,simpledialog)
Nov 07 Python
全网最全python库selenium自动化使用详细教程
Jan 12 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
第九节 绑定 [9]
2006/10/09 PHP
php学习笔记 数组遍历实现代码
2011/06/09 PHP
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
PHP URL路由类实例
2013/11/12 PHP
smarty中post用法实例
2014/11/28 PHP
php实现网页端验证码功能
2017/07/11 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
python实现归并排序算法
2018/11/22 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
如何用python处理excel表格
2020/06/09 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
Java提供了哪些企业应用编程接口
2015/02/13 面试题
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
早餐连锁店计划书
2014/01/08 职场文书
员工薪酬激励方案
2014/06/13 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js