摘要:sqlalchemy操作
1.查询
- 别名查询(label标签)
- filter与filter_by
- 子查询(params与from_statument)
- 连表查询(左连接:isouter=True,或 outerjoin)
- relationship查询与relationship反向查询
import models
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine,text
# 连接数据库
engine=create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/s8sql?charset=utf8")
Session=sessionmaker(bind=engine)
# 每次执行数据库操作时,都需要创建一个session
session=Session()
# 查全部数据
class_list=session.query(models.Classes).all()
for classes in class_list:
print(classes.id,classes.name)
#别名查询
class_list=session.query(models.Classes.id,models.Classes.name.label("xx")).all()
for classes in class_list:
print(classes.id,classes.xx)
#条件查询 filter(条件) filter_by()
obj=session.query(models.Classes).filter(models.Classes.name=="全栈9期").all()
for i in obj:
print(i.name)
obj1=session.query(models.Classes).filter(models.Classes.name=="全栈9期").first()
print(obj1.name)
obj2=session.query(models.Classes).filter_by(name="全栈10期").first()
print(obj2.name)
#子查询
result = session.query(models.Classes).from_statement(text("SELECT * FROM classes where name=:name")).params(name='全栈11期').all()
print(result)
ret =session.query(models.Classes).filter(models.Classes.id.in_(session.query(models.Classes.id).filter_by(name='全栈8期'))).all()
print(ret)
# 显示所有学生信息(含班级)
# 1、多次查询
obj=session.query(models.Student).all()
for obj in objs:
cls_obj = session.query(models.Classes).filter(models.Classes.id==obj.class_id).first()
print(obj.id,obj.username,obj.class_id,cls_obj.name)
# 2、连表查询 isouter=True mysql中leftjoin查询
objs = session.query(models.Student.id,models.Student.user,models.Classes.name).join(models.Classes,isouter=True).all()
print(objs)
# 左连接
objs=session.query(models.Student.id,models.Student.user,models.Classes.name).outerjoin(models.Classes, models.Student.c_id == models.Classes.id).all()
print(objs)
# 3、使用relationship查询
objs = session.query(models.Student).all()
for item in objs:
print(item.id,item.user,item.class_id,item.cls.name)
#4、使用relationship反向查询 全栈9期所有的学生
obj = session.query(models.Classes).filter(models.Classes.name=='全栈9期').first()
student_list = obj.stus
for item in student_list:
print(item.id,item.user)
# 提交事务
session.commit()
# 关闭session
session.close()
2.修改
- 字符串拼接
- 数值计算
import models
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
# 连接数据库
engine=create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/s8sql?charset=utf8")
Session=sessionmaker(bind=engine)
# 每次执行数据库操作时,都需要创建一个session
session=Session()
# 改
# session.query(models.Classes).filter(models.Classes.id > 1).update({"name" : "099"})
# synchronize_session=False 字符串拼接
# session.query(models.Classes).filter(models.Classes.id > 0).update({models.Classes.name: models.Classes.name + "099"}, synchronize_session=False)
# synchronize_session="evaluate" 数字计算
session.query(models.Classes).filter(models.Classes.id > 0).update({"age": models.Classes.age + 1}, synchronize_session="evaluate")
# 提交事务
session.commit()
# 关闭session
session.close()
3.删除
# 删除
import models
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
# 连接数据库
engine=create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/s8sql?charset=utf8")
Session=sessionmaker(bind=engine)
# 每次执行数据库操作时,都需要创建一个session
session=Session()
# 删
session.query(models.Classes).filter(models.Classes.id > 2).delete()
# 提交事务
session.commit()
# 关闭session
session.close()