通过SQLALchemy操作MySQL的基本增删改查

基本框架(

mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]举例
engine=create_engine("mysql+pymysql://root:@localhost:3306/db2?charset=utf8",max_overflow=5)

 1 #连接
 2 from sqlalchemy.ext.declarative import declarative_base
 3 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
 4 from sqlalchemy.orm import sessionmaker, relationship
 5 from sqlalchemy import create_engine
 6 import pymysql
 7 Base = declarative_base()
 8 engine=create_engine("mysql+pymysql://root:@localhost:3306/db2",max_overflow=5)
 9 Session=sessionmaker(bind=engine)
10 session=Session()
11 
12 
13 #提交与关闭
14 session.commit()#提交数据,增删改都需要
15 session.close()#关闭
连接执行与关闭

创建与删除表格

 1 class UserType(Base):
 2     __tablename__='usertype'
 3     id=Column(Integer,primary_key=True,autoincrement=True)
 4     title=Column(String(32),nullable=True,index=True)
 5 
 6 class Users(Base):
 7     __tablename__='users'
 8     id=Column(Integer,primary_key=True)
 9     name=Column(String(32))
10     email=Column(String(16))
11 def create_db(): #创建表
12         engine=create_engine("mysql+pymysql://root:@localhost:3306/db2",max_overflow=5)
13         Base.metadata.create_all(engine)
14 def drop_db(): #删除表
15         engine = create_engine("mysql+pymysql://root:@localhost:3306/db2", max_overflow=5)
16         Base.metadata.drop_all(engine)
类表示表名,对象表示列名

1 #增加单条
2 obj1=UserType(title='普通用户')
3 session.add(obj1)
4 #增加多条
5 objs=[
6     UserType(title='白金用户'),
7     UserType(title='黑金用户'),
8 ]
9 session.add_all(objs)
session.add,session.addall()

简单查

1 # 以下相当于sellect xx from UserType where...
2 usertype_list=session.query(UserType.title).filter(UserType.id>1)#filer里面加的是表达式
session.query()

删和改

1 session.query(UserType.title).filter(UserType.id>1).delete()
2 
3 ###修改某一列
4 ##更新全部
5 session.query(UserType.title).filter(UserType.id==1).update({'title':'黑经'})
6 ###更新字符串
7 session.query(UserType.title).filter(UserType.id>1).update({UserType.title: UserType.title + "X"}, synchronize_session=False) ##更新全部
8 ###更新数字
9 session.query(UserType.title).filter(UserType.id>1).update({"id": UserType.id + 1}, synchronize_session="evaluate")
View Code

 复杂查询条件

 1 # 条件
 2 #filter_by表示分组?filter里面必须放表达式
 3 ret = session.query(Users).filter_by(name='alex').all() 
 4 #filter里两个条件并列默认and关系
 5 ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
 6 ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
 7 ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
 8 #~相当于not in
 9 ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
10 ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
11 #引入and_和or_模块from sqlalchemy import and_, or_
12 ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
13 ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
14 ret = session.query(Users).filter(
15     or_(
16         Users.id < 2,
17         and_(Users.name == 'eric', Users.id > 3),
18         Users.extra != ""
19     )).all()
20 
21 
22 # 通配符,若为_则表示一个字符
23 ret = session.query(Users).filter(Users.name.like('e%')).all()
24 ret = session.query(Users).filter(~Users.name.like('e%')).all()
25 
26 # 限制
27 ret = session.query(Users)[1:2]
28 
29 # 排序
30 ret = session.query(Users).order_by(Users.name.desc()).all()
31 ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()#第一个相同时根据第二个排
32 
33 # 分组,相当于mysql的聚合函数
34 from sqlalchemy.sql import func
35 
36 ret = session.query(Users).group_by(Users.extra).all()
37 ret = session.query(
38     func.max(Users.id),
39     func.sum(Users.id),
40     func.min(Users.id)).group_by(Users.name).all()
41 
42 ret = session.query(
43     func.max(Users.id),
44     func.sum(Users.id),
45     func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()

 连表与组合(外键必须是在SQLALchemy中创建的,否则连表不成功)

 1 # 连表
 2 
 3 ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
 4 ret = session.query(Person).join(Favor).all()
 5 ret = session.query(Person).join(Favor, isouter=True).all()
 6 
 7 
 8 # 组合
 9 q1 = session.query(Users.name).filter(Users.id > 2)
10 q2 = session.query(Favor.caption).filter(Favor.nid < 2)
11 ret = q1.union(q2).all()#自动去重
12 
13 q1 = session.query(Users.name).filter(Users.id > 2)
14 q2 = session.query(Favor.caption).filter(Favor.nid < 2)
15 ret = q1.union_all(q2).all()#不去重
View Code

 临时表操作

1 ### select * from (select * from tb)as B等价于
2 q1=session.query(Users).filter(Users.id>1).subquery()
3 result=session.query(q1).all()
4 print(result)
View Code

 子查询(试验未成功)

SELECT usertype.tid AS usertype_tid, (SELECT users.id, users.name, users.email 
FROM users 
WHERE users.name = usertype.tid) AS anon_1 
FROM usertype

等价于
result = session.query(UserType.tid,session.query(Users).filter(Users.name==UserType.tid).as_scalar())
View Code

 

posted @ 2020-03-12 15:57  爬爬QQ  阅读(462)  评论(0)    收藏  举报