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编写的微博应用
Oct 17 Python
python中for语句简单遍历数据的方法
May 07 Python
分析Python中解析构建数据知识
Jan 20 Python
PyQt5 QSerialPort子线程操作的实现
Apr 21 Python
python3+PyQt5泛型委托详解
Apr 24 Python
Python 通过调用接口获取公交信息的实例
Dec 17 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
pygame实现烟雨蒙蒙下彩虹雨
Nov 11 Python
Selenium常见异常解析及解决方案示范
Apr 10 Python
IDLE下Python文件编辑和运行操作
Apr 25 Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
第1次亲密接触PHP5(1)
2006/10/09 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
javascript实现2016新年版日历
2016/01/25 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
vue移动端的左右滑动事件详解
2020/06/17 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
基于ant design日期控件使用_仅月份的操作
2020/10/27 Javascript
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
关于python pycharm中输出的内容不全的解决办法
2020/01/10 Python
python和go语言的区别是什么
2020/07/20 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
新西兰演唱会和体育门票网站:Ticketmaster新西兰
2017/10/07 全球购物
奶茶店创业计划书
2014/08/14 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
运动会广播稿200字
2014/10/18 职场文书
环卫工人慰问信
2015/02/15 职场文书
办公室管理规章制度
2015/08/04 职场文书
如何做好工作总结!
2019/04/10 职场文书
幼儿园大班教师评语
2019/06/21 职场文书