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中List的sort方法指南
Sep 01 Python
python中文编码问题小结
Sep 28 Python
python根据京东商品url获取产品价格
Aug 09 Python
Python中方法链的使用方法
Feb 23 Python
python使用Tesseract库识别验证
Mar 21 Python
python中报错&quot;json.decoder.JSONDecodeError: Expecting value:&quot;的解决
Apr 29 Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
如何基于线程池提升request模块效率
Apr 18 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
Nov 30 Python
Python 批量下载阴阳师网站壁纸
May 19 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
用PHP实现登陆验证码(类似条行码状)
2006/10/09 PHP
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
php 魔术函数使用说明
2010/02/21 PHP
php批量更改数据库表前缀实现方法
2013/10/26 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
2013/01/09 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
canvas 弹幕效果(实例分享)
2017/01/11 Javascript
详谈jQuery.load()和Jsp的include的区别
2017/04/12 jQuery
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
vue移动端弹框组件的实例
2018/09/25 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
解决uWSGI的编码问题详解
2017/03/24 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
西尔斯百货官网:Sears
2016/09/06 全球购物
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
家长给孩子的表扬信
2014/01/17 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
行政监察建议书
2014/05/19 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
2015年教师节慰问信
2015/03/23 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python