一,安装
pip3 install sqlalchemy 安装sqlalchemy
pip3 install pymysql 安装连接数据库的包
安装数据库
二, 简介
object-relation mapping(ORM)技术,把关系数据库的表结构映射到对象上
三, 创建数据表
1 # 1,导入官宣模型 2 from sqlalchemy.ext.declarative import declarative_base 3 # 导入数据类型 4 from sqlalchemy import Column, Integer, String 5 # 导入连接数据库的包 6 from sqlalchemy import create_engine 7 8 # 2,实例化官宣模型 9 Base = declarative_base() 10 11 12 # 3,创建object 13 # 当前这个object继承了Base也就是说代表object继承了ORM模型 14 class User(Base): # 相当于Django Models中的Model 15 # (1),为table创建名字(数据库表名) 16 __tablename__ = "user" 17 # (2),创建字段 18 # id字段是数字类型,是主键,自增长 19 id = Column(Integer,primary_key=True,autoincrement=True) 20 # name字段是字符串类型(最大长度32),设置索引(按照该字段排序 21 name = Column(String(32),index=True) 22 23 24 # 4,创建数据库引擎 25 engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/sqlalchemy?charset=utf8") 26 # 5,Base自动检索所有继承Base的ORM对象,并且创建所有的数据表 27 Base.metadata.create_all(engine)
运行程序,然后就在数据库中的sqlalchemy库中创建好了一张名为user的表

四 , 增删改查操作
通过上面的代码和操作,我们已经通过sqlalchemy创建好了一张user表,接下来看一下怎么对表进行简单的增删改查操作
数据库中 增 改 删 都是操作,也就是说执行以上三种操作的时候一定要commit
(1) 增加数据
1 # SQL中: 2 # insert 添加数据 3 # insert One 添加一条数据 4 # insert into user(name) values("liang") 5 # ORM中: 6 # 1,导入之前做好的ORM对象User 7 from onetable.create_table import User 8 # 导入sqlalchemy.orm中的sessionmaker 9 from sqlalchemy.orm import sessionmaker 10 # 导入之前创建好的create_engine 11 from onetable.create_table import engine 12 13 # 2,使用User模型创建一条数据 14 user1 = User(name="liang") 15 16 # 3, 写入数据库 17 # 创建sessionmaker 会话对象,将数据库引擎engine交给sessionmaker 18 Session = sessionmaker(engine) 19 # 打开会话对象Session 20 db_session = Session() 21 # 在db_session绘画中添加一条UserORM模型创建的数据 22 db_session.add(user1) 23 # 使用db_session会话提交 ,指的是将db_session中的所有指令一次性提交 24 db_session.commit() 25 # 关闭会话 26 db_session.close()
在这个过程中遇到一个小问题,就是导入自己写的包的时候飘红,但是程序运行没问题,原因是目录设置的问题,然后将上一级目录带上from onetable.create_table import User 就没有问题了
1 # SQL中: 2 # insert 添加数据 3 # insert One 添加一条数据 4 # insert into user(name) values("liang") 5 # ORM中: 6 # 1,导入之前做好的ORM对象User 7 from onetable.create_table import User 8 # 导入sqlalchemy.orm中的sessionmaker 9 from sqlalchemy.orm import sessionmaker 10 # 导入之前创建好的create_engine 11 from onetable.create_table import engine 12 13 # 2,使用User模型创建数据 14 user2 = User(name="ding") 15 user3 = User(name="doudou") 16 17 # 3, 写入数据库 18 # 创建sessionmaker 会话对象,将数据库引擎engine交给sessionmaker 19 Session = sessionmaker(engine) 20 # 打开会话对象Session 21 db_session = Session() 22 # 在db_session绘画中添加一条UserORM模型创建的数据 23 db_session.add(user2) 24 db_session.add(user3) 25 # 使用db_session会话提交 ,指的是将db_session中的所有指令一次性提交 26 db_session.commit() 27 # 关闭会话 28 db_session.close()
1 # SQL中: 2 # insert 添加数据 3 # insert One 添加一条数据 4 # insert into user(name) values("liang") 5 # ORM中: 6 # 1,导入之前做好的ORM对象User 7 from onetable.create_table import User 8 # 导入sqlalchemy.orm中的sessionmaker 9 from sqlalchemy.orm import sessionmaker 10 # 导入之前创建好的create_engine 11 from onetable.create_table import engine 12 13 # 2,使用User模型创建数据 14 user_list = [ 15 User(name="111"), 16 User(name="222"), 17 User(name="333"), 18 ] 19 # 3, 写入数据库 20 # 创建sessionmaker 会话对象,将数据库引擎engine交给sessionmaker 21 Session = sessionmaker(engine) 22 # 打开会话对象Session 23 db_session = Session() 24 # 在db_session绘画中添加一条UserORM模型创建的数据 25 db_session.add_all(user_list) 26 # 使用db_session会话提交 ,指的是将db_session中的所有指令一次性提交 27 db_session.commit() 28 # 关闭会话 29 db_session.close()
(2) 查询数据
1 # ORM操作查询数据 2 # 有了之前insert增加数据的经验,那么查询之前的准备工作也是类似的 3 from one_table.create_table import User, engine 4 from sqlalchemy.orm import sessionmaker 5 6 Session = sessionmaker(engine) 7 db_session = Session() 8 9 # SQL中: 10 # select * from user 查询user表中的所有数据 11 # sqlalchemy中: 12 # 使用db_session会话执行User表query(User)取出全部数据 13 user_all_list = db_session.query(User).all() 14 print(user_all_list) 15 # [<one_table.create_table.User object at 0x000001722FC683C8>, <one_table.create_table.User object at 0x000001722FC68518>, <one_table.create_table.User object at 0x000001722FC684A8>, <one_table.create_table.User object at 0x000001722FC685F8>, <one_table.create_table.User object at 0x000001722FC68588>, <one_table.create_table.User object at 0x000001722FC686D8>] 16 # 查询结果如上,是一个列表,然后我们就可以循环取数据了,然后.出属性 17 for i in user_all_list: 18 print(i.id,i.name) 19 # 4 111 20 # 5 222 21 # 6 333 22 # 2 ding 23 # 3 doudou 24 # 1 liang 25 26 # 关闭对话 27 db_session.close()
1 # ORM操作查询数据 2 # 有了之前insert增加数据的经验,那么查询之前的准备工作也是类似的 3 from one_table.create_table import User, engine 4 from sqlalchemy.orm import sessionmaker 5 6 Session = sessionmaker(engine) 7 db_session = Session() 8 9 user1 = db_session.query(User).filter(User.id>=3) 10 user2 = db_session.query(User).filter(User.id>=3).first() 11 print(user1) 12 # SELECT user.id AS user_id, user.name AS user_name 13 # FROM user 14 # WHERE user.id >= %(id_1)s 15 for i in user1: 16 print(i.id,i.name) 17 # 3 doudou 18 # 4 111 19 # 5 222 20 # 6 333 21 print(user2.id,user2.name) 22 # 3 doudou 23 db_session.close()
(3) 修改数据
1 from one_table.create_table import User, engine 2 from sqlalchemy.orm import sessionmaker 3 4 Session = sessionmaker(engine) 5 db_session = Session() 6 7 # SQL中: 8 # UPDATE user SET name="haha" WHERE id=2 更新一条数据 9 # sqlalchemy中: 10 # 使用db_session执行User表query(User)筛选User.id=2的数据filter(User.id==2) 11 # 将name字段的值改为haha update({"name":"haha"}) 12 res = db_session.query(User).filter(User.id==2).update({"name":"haha"}) 13 print(res) # res是当前语句所更新的行数 14 15 # 提交 16 db_session.commit() 17 db_session.close()
1 from one_table.create_table import User, engine 2 from sqlalchemy.orm import sessionmaker 3 4 Session = sessionmaker(engine) 5 db_session = Session() 6 7 # SQL中: 8 # UPDATE user SET name="haha" WHERE id=2 更新一条数据 9 # sqlalchemy中: 10 # 使用db_session执行User表query(User)筛选User.id=2的数据filter(User.id==2) 11 # 将name字段的值改为haha update({"name":"haha"}) 12 res = db_session.query(User).filter(User.id>=3).update({"name":"haha"}) 13 print(res) # res是当前语句所更新的行数 14 15 # 提交 16 db_session.commit() 17 db_session.close()
(4)删除数据
1 from one_table.create_table import User, engine 2 from sqlalchemy.orm import sessionmaker 3 4 Session = sessionmaker(engine) 5 db_session = Session() 6 7 # SQL中 8 # DELETE FROM `user` WHERE id=2 9 # sqlalchemy中 10 res = db_session.query(User).filter(User.id==2).delete() 11 print(res) 12 13 db_session.commit() 14 db_session.close()
(5)高级查询
1 1 # 高级版查询操作,厉害了哦 2 2 #老规矩 3 3 from my_create_table import User,engine 4 4 from sqlalchemy.orm import sessionmaker 5 5 6 6 Session = sessionmaker(engine) 7 7 db_session = Session() 8 8 9 9 # 查询数据表操作 10 10 # and or 11 11 from sqlalchemy.sql import and_ , or_ 12 12 ret = db_session.query(User).filter(and_(User.id > 3, User.name == 'liang')).all() 13 13 ret = db_session.query(User).filter(or_(User.id < 2, User.name == 'liang')).all() 14 14 15 15 # 查询所有数据 16 16 r1 = db_session.query(User).all() 17 17 18 18 # 查询数据 指定查询数据列 加入别名 19 19 r2 = db_session.query(User.name.label('username'), User.id).first() 20 20 print(r2.id,r2.username) 21 21 22 22 # 表达式筛选条件 23 23 r3 = db_session.query(User).filter(User.name == "liang").all() 24 24 25 25 # 原生SQL筛选条件 26 26 r4 = db_session.query(User).filter_by(name='liang').all() 27 27 r5 = db_session.query(User).filter_by(name='liang').first() 28 28 29 29 # 字符串匹配方式筛选条件 并使用 order_by进行排序 30 30 r6 = db_session.query(User).filter(text("id<:value and name=:name")).params(value=224, name='liang').order_by(User.id).all() 31 31 32 32 #原生SQL查询 33 33 r7 = db_session.query(User).from_statement(text("SELECT * FROM User where name=:name")).params(name='liang').all() 34 34 35 35 # 筛选查询列 36 36 # query的时候我们不在使用User ORM对象,而是使用User.name来对内容进行选取 37 37 user_list = db_session.query(User.name).all() 38 38 print(user_list) 39 39 for row in user_list: 40 40 print(row.name) 41 41 42 42 # 别名映射 name as nick 43 43 user_list = db_session.query(User.name.label("nick")).all() 44 44 print(user_list) 45 45 for row in user_list: 46 46 print(row.nick) # 这里要写别名了 47 47 48 48 # 筛选条件格式 49 49 user_list = db_session.query(User).filter(User.name == "liang").all() 50 50 user_list = db_session.query(User).filter(User.name == "liang").first() 51 51 user_list = db_session.query(User).filter_by(name="liang").first() 52 52 for row in user_list: 53 53 print(row.nick) 54 54 55 55 # 复杂查询 56 56 from sqlalchemy.sql import text 57 57 user_list = db_session.query(User).filter(text("id<:value and name=:name")).params(value=3,name="liang") 58 58 59 59 # 查询语句 60 60 from sqlalchemy.sql import text 61 61 user_list = db_session.query(User).filter(text("select * from User id<:value and name=:name")).params(value=3,name="liang") 62 62 63 63 # 排序 : 64 64 user_list = db_session.query(User).order_by(User.id).all() 65 65 user_list = db_session.query(User).order_by(User.id.desc()).all() 66 66 for row in user_list: 67 67 print(row.name,row.id) 68 68 69 69 #其他查询条件 70 70 """ 71 71 ret = session.query(User).filter_by(name='liang').all() 72 72 ret = session.query(User).filter(User.id > 1, User.name == 'liang').all() 73 73 ret = session.query(User).filter(User.id.between(1, 3), User.name == 'liang').all() # between 大于1小于3的 74 74 ret = session.query(User).filter(User.id.in_([1,3,4])).all() # in_([1,3,4]) 只查询id等于1,3,4的 75 75 ret = session.query(User).filter(~User.id.in_([1,3,4])).all() # ~xxxx.in_([1,3,4]) 查询不等于1,3,4的 76 76 ret = session.query(User).filter(User.id.in_(session.query(User.id).filter_by(name='liang'))).all() 子查询 77 77 from sqlalchemy import and_, or_ 78 78 ret = session.query(User).filter(and_(User.id > 3, User.name == 'liang')).all() 79 79 ret = session.query(User).filter(or_(User.id < 2, User.name == 'liang')).all() 80 80 ret = session.query(User).filter( 81 81 or_( 82 82 User.id < 2, 83 83 and_(User.name == 'eric', User.id > 3), 84 84 User.extra != "" 85 85 )).all() 86 86 # select * from User where id<2 or (name="eric" and id>3) or extra != "" 87 87 88 88 # 通配符 89 89 ret = db_session.query(User).filter(User.name.like('e%')).all() 90 90 ret = db_session.query(User).filter(~User.name.like('e%')).all() 91 91 92 92 # 限制 93 93 ret = db_session.query(User)[1:2] 94 94 95 95 # 排序 96 96 ret = db_session.query(User).order_by(User.name.desc()).all() 97 97 ret = db_session.query(User).order_by(User.name.desc(), User.id.asc()).all() 98 98 99 99 # 分组 100 100 from sqlalchemy.sql import func 101 101 102 102 ret = db_session.query(User).group_by(User.extra).all() 103 103 ret = db_session.query( 104 104 func.max(User.id), 105 105 func.sum(User.id), 106 106 func.min(User.id)).group_by(User.name).all() 107 107 108 108 ret = db_session.query( 109 109 func.max(User.id), 110 110 func.sum(User.id), 111 111 func.min(User.id)).group_by(User.name).having(func.min(User.id) >2).all() 112 112 """ 113 113 114 114 # 关闭连接 115 115 db_session.close()
(6)高级版修改数据操作
1 1 #高级版更新操作 2 2 from my_create_table import User,engine 3 3 from sqlalchemy.orm import sessionmaker 4 4 5 5 Session = sessionmaker(engine) 6 6 db_session = Session() 7 7 8 8 #直接修改 9 9 db_session.query(User).filter(User.id > 0).update({"name" : "099"}) 10 10 11 11 #在原有值基础上添加 - 1 12 12 db_session.query(User).filter(User.id > 0).update({User.name: User.name + "099"}, synchronize_session=False) 13 13 14 14 #在原有值基础上添加 - 2 15 15 db_session.query(User).filter(User.id > 0).update({"age": User.age + 1}, synchronize_session="evaluate") 16 16 db_session.commit()
浙公网安备 33010602011771号