SQLAlchemy(1):单表操作
SQLAlchemy 是一个 ORM框架:类对应表,类中的字段对应表中的列,类的对象对应表的一条记录;作用:帮助我们使用类和对象快速实现数据库操作
操作数据库的方式:
1. 原生SQL
- pymysql :支持 python2 和 python3
- MySQLdb :只支持 python2
2. ORM框架 :框架本身要是有ORM应用自己的(如 Django),要是没有就用 SQLAlchemy
安装 SQLAlchemy:
pip install sqlalchemy
注: SQLAlchemy 默认不能修改表结构;想修改表结构需要引入第三方组件
SQLAlchemy 单表
创建数据库的表 --- 单表:models.py
import datetime
from sqlalchemy import create_engine # 引入 创建引擎
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index # 引入列和数据类型 Base = declarative_base() # Base 要自己实例化 class Users(Base): # Users是类名;类 继承 Base
__tablename__ = 'users' # 数据库的表名叫 "users" id = Column(Integer, primary_key=True) # Colume表示列; id 是表中的列,Interger 表示整形,primary_key=True 表示 是主键
name = Column(String(32), index=True, nullable=False) # name 为表中的列, String(32) 表示 MySQL中的 Varchar(32), index=True 表示索引,nullable=False 表示不允许为空
# email = Column(String(32), unique=True)
# ctime = Column(DateTime, default=datetime.datetime.now)
# extra = Column(Text, nullable=True) def init_db():
"""
根据类创建数据库的表
:return:
"""
engine = create_engine( # 创建数据库连接
"mysql+pymysql://root:tj037778@127.0.0.1:3306/dbtest?charset=utf8", # mysql 表示要连接的数据库;pymysql 表示用 pymysql 来连接;用户名是 root,密码是123,连接本地的 dbtest 这个数据库
max_overflow=0, # 超过连接池大小外最多创建的连接;即超过 pool_size 后最多能溢出多少个连接
pool_size=5, # 连接池大小
pool_timeout=10, # 池中没有线程(连接)最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置);-1表示不重建
) Base.metadata.create_all(engine) # Base.metadata.create_all() : 找到当前 py 文件下面 继承了Base的所有的类,在数据库中生成一张表 def drop_db():
"""
根据类删除数据库中的表
:return:
"""
engine = create_engine(
"mysql+pymysql://root:tj037778@127.0.0.1:3306/dbtest?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
) Base.metadata.drop_all(engine) # Base.metadata.drop_all() : 找到当前 py 文件下面 继承了Base的所有的类,在数据库中删除相应的表 if __name__ == "__main__":
init_db()
# drop_db()
单表基本增删改查示例:crud.py
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Users # 导入 Users 类 # 创建数据库连接(crud 这个py文件的数据库连接)
engine = create_engine("mysql+pymysql://root:tj037778@127.0.0.1:3306/dbtest", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine) # Session可理解成 连接池 # 通过 SQLAlchemy 操作数据库:通过 Users 类对 users 表进行增删改查 # 每次执行数据库操作时,都需要创建一个session (可理解成一个连接)
session = Session() # ############# 执行ORM操作:增 #############
# 1. 单条增加
"""
obj1 = Users(name="neo") # 实例化一个 Users 的对象;该对象是在内存中创建
session.add(obj1) # session 根据 obj1 在表中增加一条数据
session.commit() # session.add() 之后要 commit() 一下
session.close() # 关闭 连接
""" # 2. 多条增加
"""
obj2 = Users(name="egon")
obj3 = Users(name="alex") session.add_all( # 增加多个;也可以 session.add() 多次
[obj2,obj3] # 添加的记录(对象)放入 列表 中
) session.commit()
session.close()
""" # ############# 执行ORM操作:查 #############
# 1. 查询所有
res = session.query(Users).all() # 查询 Users 表中的所有数据
print(res)
# 打印结果(按id 倒序排列): [<models.Users object at 0x000002132AEFE400>, <models.Users object at 0x000002132AEFE470>, <models.Users object at 0x000002132AEFE4E0>] # 列表套对象的形式
for row in res:
print(row.id, row.name) # 2. 条件查询
res_filter = session.query(Users).filter(Users.id >= 2) # filter() 中直接加 表达式
for row in res_filter:
print(row.id, row.name) # 3. 只取第一个
res_first = session.query(Users).filter(Users.id >= 2).first() # first() 取到的结果不再是一个列表,而是一个对象
print(res_first.id, res_first.name) # ############# 执行ORM操作:删 #############
session.query(Users).filter(Users.id >= 3).delete() # 查询结果 .delete()
session.commit() # 删除之后也要 commit() # ############# 执行ORM操作:改 #############
session.query(Users).filter(Users.id == 1).update({Users.name: "NEO"}) # 查询结果.update({ }) ; 返回 更新的条数
# session.query(Users).filter(Users.id==1).update({"name":"neo"}) # 也可以用这种写法
session.commit() # update() 补充:
# session.query(Users).filter(Users.id > 0).update({Users.name: Users.name + "099"}, synchronize_session=False) # 在字段原有值的基础上更新时,synchronize_session=False 表示是 字符串 的拼接
# session.query(Users).filter(Users.id > 0).update({"age": Users.age + 1}, synchronize_session="evaluate") # 在字段原有值的基础上更新时,synchronize_session="evaluate" 表示是 数值 的相加减 (默认是这种)
# session.commit() session.close()
SQLAlchemy 单表的其它常用操作:
# ##################### 其它常用操作 ########################
# 1. 查询某些字段
res = session.query(Users.id,Users.name).all() # 查询 id字段 和 name字段;结果为列表
for item in res:
print(item,type(item),item[0],item.name) # item 不是元组,只是形式像元组,并且可以利用 item[0],item[1] 这种元组的用法去获取item中的值,也可以利用 item.id 和 item.name 获取item中的值
# 打印结果:
# (2, 'egon') <class 'sqlalchemy.util._collections.result'> 2 egon
# (1, 'NEO') <class 'sqlalchemy.util._collections.result'> 1 NEOsult'> # 2. 给某字段起个别名(sql 中的 as): .label("别名")
res = session.query(Users.id,Users.name.label("cname")).all()
for item in res:
print(item.cname)
# 打印结果:
# egon
# NEO # 3. 查看sql语句:去掉 .all()
query = session.query(Users.id,Users.name.label("cname"))
print(query)
# 打印结果:
# SELECT users.id AS users_id, users.name AS cname FROM users # 4. 其它
ret1 = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all() # filter() 中的 “,” 表示的是 sql 条件中的 and (默认条件为 and )
ret2 = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all() # .between : sql 条件中的 between...and
ret3 = session.query(Users).filter(Users.id.in_([1,3,4])).all() # Users.id.in_([1,3,4]) :sql 条件中的 in
ret4 = session.query(Users).filter(~Users.id.in_([1,3,4])).all() # ~Users.id.in_([1,3,4]) :not in
# 5. 子查询
ret5 = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all() # 一个查询结果作为另一个的查询条件 # 6. and 和 or 的嵌套
from sqlalchemy import and_,or_ # 先导入 and 和 or
session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all() # and_() 中的条件是 and 关系 (默认也是 and)
session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all() # or_() 中的条件是 or 关系
session.query(Users).filter(
or_( # 下面的三个条件是 or 的关系
Users.id < 2,
and_(Users.name == 'eric', Users.id > 3), # 这两个是 and 的关系
# Users.extra != "" # 这个是 not (非)
)).all() ret6 = session.query(Users).filter_by(name='alex').all() # filter_by() 过滤
"""
filter() 和 filter_by() 的区别:
filter:column == expression
1. 传入参数的写法,要用:类名.列名 两个等号 去判断
2. 更复杂的查询的语法,比如and_(),or_()等多个条件的查询,只支持filter filter_by:keyword = expression
1. 传入参数的写法,只需要用:(不带类名的)列名 单个等号 就可以判断
""" # 7. 通配符
ret7 = session.query(Users).filter(Users.name.like('n%')).all() # like
ret8 = session.query(Users).filter(~Users.name.like('n%')).all() # not like
ret9 = session.query(Users).filter(Users.name.like('n_')).all() # like # 8. 切片 (限制/分页)
ret10 = session.query(Users)[1:2] # 9. 排序
ret11 = session.query(Users).order_by(Users.name.desc()).all()
ret12 = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all() # 10. 分组:group_by()
from sqlalchemy.sql import func # 导入 func,func 中有聚合函数 # ret13 = session.query(Users).group_by(Users.depart_id).all() # group_by(字段)之后不要 query() 所有字段
ret14 = session.query(
Users.name,
func.max(Users.id), # 自己指定取哪个字段
func.sum(Users.id), # 非分组字段获取时,使用聚合函数
func.min(Users.id)
).group_by(Users.name).all() ret15 = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)
).group_by(Users.name).having(func.count(Users.id) >2).all() # 根据 name 分组,func.count(Users.id) > 2 ;根据聚合函数进行二次筛选:having # 11. 组合(垂直/上下连表):union 和 union all --- union all 去重,union 不去重
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret16 = q1.union(q2).all() q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret17 = q1.union_all(q2).all()
SQLAlchemy(1):单表操作的更多相关文章
- sqlalchemy 学习--单表操作
以下所有代码片段都使用了统一的引用,该引用如下: from sqlalchemy import create_engine, ForeignKey from sqlalchemy.ext.declar ...
- sqlalchemy模块介绍、单表操作、一对多表操作、多对多表操作、flask集成.
今日内容概要 sqlalchemy介绍和快速使用 单表操作增删查改 一对多 多对多 flask集成 内容详细 1.sqlalchemy介绍和快速使用 # SQLAlchemy是一个基于 Python实 ...
- ORM 简介 单表操作
cls超 Django基础五之django模型层(一)单表操作 本节目录 一 ORM简介 二 单表操作 三xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型 ...
- Django基础五之django模型层(一)单表操作
一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...
- 单表操作ORM
博客园 首页 新随笔 联系 管理 订阅 随笔- 0 文章- 339 评论- 29 Django基础五之django模型层(一)单表操作 本节目录 一 ORM简介 二 单表操作 三 章节作业 ...
- 05.Django基础五之django模型层(一)单表操作
一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...
- Django-模型层(单表操作)
目录 1.ORM简介 2.单表操作 2.1创建表 2.2添加表纪录 2.3查询表纪录 2.4删除表纪录 2.5修改表纪录 1.ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了 ...
- 05 Django之模型层---单表操作
一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...
- day 69 Django基础五之django模型层(一)单表操作
Django基础五之django模型层(一)单表操作 本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...
- day 55 Django基础五之django模型层(一)单表操作
Django基础五之django模型层(一)单表操作 本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它 ...
随机推荐
- Sping Boot返回Json格式自定义
转载请注明http://www.cnblogs.com/majianming/p/8491020.html 在写项目过程中,遇到了需要定义返回的json字段格式的问题 例如在实体属性中,我有一个字段是 ...
- 开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码
开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码. 开源地址: https://github.com/jkpang/PPRows
- [BZOJ1004][HNOI2008]Cards 群论+置换群+DP
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 首先贴几个群论相关定义和引理. 群:G是一个集合,*是定义在这个集合上的一个运算. ...
- vuex使用之state访问状态对象
引入vuex1.利用npm包管理工具,进行安装 vuex.在控制命令行中输入下边的命令就可以了. npm install vuex --save 需要注意的是这里一定要加上 –save,因为你这个包我 ...
- PHP面向对象考察点
面向对象三大特性 封装 封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义: 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象). ...
- (转)hibernate-5.0.7+struts-2.3.24+spring-4.2.4三大框架整合
http://blog.csdn.net/yerenyuan_pku/article/details/70040220 SSH框架整合思想 三大框架应用在JavaEE三层结构,每一层都用到了不同的框架 ...
- swift 使用计算属性+结构管理内存
class GooClass { deinit { print("aaaaaaaa") } var str = "gooClass" } struct GooS ...
- fedora配置ip
fedora20配置静态ip 原创 2015年08月08日 14:36:01 标签: fedora / linux / 网络配置 / ip配置 / 网络设置 2403 在linux的世界里,给主机设置 ...
- cf536c——思路题
题目 题目:Lunar New Year and Number Division 题目大意:给定一个数字序列,可以任意分组(可调整顺序),但每组至少两个,求每组内数字和的平方的最小值 思路 首先,易证 ...
- java组件不存在解决方案:右侧Maven Projects展开后左上角第一个刷新按钮 刷新后就会从新加载所有java的依赖项了
java组件不存在解决方案:右侧Maven Projects展开后左上角第一个刷新按钮 刷新后就会从新加载所有java的依赖项了 软件:idea 问题产生:其他同事进行开发,引入新java组件后提交 ...