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实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
Python Web框架Pylons中使用MongoDB的例子
Dec 03 Python
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
Python Web框架Flask中使用七牛云存储实例
Feb 08 Python
python使用socket连接远程服务器的方法
Apr 29 Python
详解在Python程序中自定义异常的方法
Oct 16 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
深入理解Django自定义信号(signals)
Oct 15 Python
python样条插值的实现代码
Dec 17 Python
python获取array中指定元素的示例
Nov 26 Python
基于python实现上传文件到OSS代码实例
May 09 Python
python 实时调取摄像头的示例代码
Nov 25 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 星际争霸
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
javascript定时变换图片实例代码
2013/03/17 Javascript
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
解决使用vue.js路由后失效的问题
2018/03/17 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
深入理解令牌认证机制(token)
2019/08/22 Javascript
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
python实现同时给多个变量赋值的方法
2015/04/30 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
Python聊天室程序(基础版)
2018/04/01 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
div或img图片高度随宽度自适应的方法
2020/02/06 HTML / CSS
建筑工程实习自我鉴定
2013/09/19 职场文书
怎么写自荐书范文
2014/02/12 职场文书
群众路线教育实践活动心得体会
2014/03/07 职场文书
爱的承诺书
2015/01/20 职场文书
演讲开头怎么书写?
2019/08/06 职场文书