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两个整数相除得到浮点数值的方法
Mar 18 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
Flask框架的学习指南之开发环境搭建
Nov 20 Python
Python实现批量压缩图片
Jan 25 Python
python中将\\uxxxx转换为Unicode字符串的方法
Sep 06 Python
浅析python继承与多重继承
Sep 13 Python
python日期相关操作实例小结
Jun 24 Python
Python编程中类与类的关系详解
Aug 08 Python
ubuntu上安装python的实例方法
Sep 30 Python
python 实现return返回多个值
Nov 19 Python
python进行参数传递的方法
May 12 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
May 07 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
ip签名探针
2006/10/09 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
深入讲解AngularJS中的自定义指令的使用
2015/06/18 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
python字符串的方法与操作大全
2018/01/30 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
网上蛋糕店创业计划书
2014/01/24 职场文书
汽车促销活动方案
2014/03/31 职场文书
银行奉献演讲稿
2014/09/16 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
2015共产党员公开承诺书
2015/01/22 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
导游词之上海豫园
2019/10/24 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
python实现简易自习室座位预约系统
2021/06/30 Python
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS
Python OpenCV实现图形检测示例详解
2022/04/08 Python