from models import User,Book
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session
from sqlalchemy.sql import text
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/aaa",)
Session = sessionmaker(bind=engine)
session = scoped_session(Session)
# 增加 :add add_all
user = User(name='杨颖',email='55@qq.com',extra='孤寡孤寡孤寡')
user1 = User(name='白鹿',email='77@qq.com',extra='发发发发发发付')
# session.add(user)
session.add_all([user,user1])
session.commit()
session.close()
# 2 基本查 filter filter_by filer:写条件 filter_by:等于的值filter# 2.1 session.query(User) 中写表模型,可以写多个表模型(连表操作) select * from User;# 2.2 filter 过滤条件,必须写表达式 == >= <= != select * from user where user.id=1# 2.3 all:普通列表 first
user = session.query(User).filter(User.name == 'lqz').first()
user = session.query(User).filter(User.name != 'lqz').all()
print(user)
res = session.query(User).filter(User.id > 1).all()
print(res)
# filter_by 直接写等式 不能写成 User.name = 'lqz'
user = session.query(User).filter_by(name='lqz').first()
user = session.query(User).filter_by(id=2).first()
user = session.query(User).filter_by(id=2).first()
print(user)
# 3 删除(查到才能删) filter或filter_by查询的结果 不要all或first出来, .delete()即可
res = session.query(User).filter_by(id=2).delete()
session.commit() # 一定不要忘了print(res) # 影响的行数# 4 修改(查到才能改)# 方式一:update修改
res = session.query(User).filter_by(id=3).update({"name" : "彭于晏"})
print(res)
session.commit()
# 方式二,使用对象修改
res = session.query(User).filter_by(id=3).first()
res = session.query(User).filter_by(name='zzz').first()
res.name='来来来'print(res.id)
session.add(res) # add 如果有主键,就是修改,如果没有主键就是新增
session.commit()
# 修改方式# 当字符串相加 djagno中使用 F 函数
res=session.query(User).filter(User.id > 0).update({User.name: User.name + "099"}, synchronize_session=False)
print(res)
# 加数字(记住)
res=session.query(User).filter(User.id > 0).update({User.age: User.age + 99}, synchronize_session="evaluate")
print(res)
session.commit()
高级查询
# 4 查询: filer:写条件 filter_by:等于的值# 4.1 查询所有 是list对象
res = session.query(User).all() # 是个普通列表print(type(res))
print(len(res))
# 4.1.1 只查询某几个字段
res = session.query(User.name.label('xx'), User.email)
print(res) # 打出原生sql# print(res.all())for item in res.all():
print(item[0])
# 4.1.2 filter传的是表达式,filter_by传的是参数
res = session.query(User).filter(User.name == "刘亦菲").all()
res = session.query(User).filter(User.name != "刘亦菲").all()
res = session.query(User).filter(User.name != "刘亦菲", User.email == '66@qq.com').all() # django 中使用 Q
res = session.query(User).filter_by(name='lqz099').all()
res = session.query(User).filter_by(name='lqz099',email='47@qq.com').all()
print(len(res))
# 4.2 取一个 all了后是list,list 没有first方法
res = session.query(User).first()
print(res)
# 4.3 查询所有,使用占位符(了解) :value :name# select * from user where id <20 or name=lqz099
res = session.query(User).filter(text("id<:value or name=:name")).params(value=10, name='刘亦菲').all()
print(res)
# 4.4 自定义查询(了解)# from_statement 写纯原生sql
res=session.query(User).from_statement(text("SELECT * FROM users where email=:email")).params(email='99@qq.com').all()
# print(type(res[0])) # 是book的对象,但是查的是User表 不要这样写print(res[0].name) ## 4.5 高级查询# 表达式,and条件连接
res = session.query(User).filter(User.id > 1 , User.name == '杨颖').all() # and条件print(res)
其他查询方法
# between
res = session.query(User).filter(User.id.between(1, 9), User.name == '白鹿').all()
print(res)
# in
res = session.query(User).filter(User.id.in_([1,3,4])).all()
print(res)
# ~非,除。。外
res = session.query(User).filter(~User.id.in_([1,3,4])).all()
print(res)
# 二次筛选
res = session.query(User).filter(~User.id.in_(session.query(User.id).filter_by(name='白鹿'))).all()
print(res)
# and or条件from sqlalchemy import and_, or_
# or_包裹的都是or条件,and_包裹的都是and条件
res = session.query(User).filter(and_(User.id >= 3, User.name == '刘亦菲')).all() # and条件
res = session.query(User).filter(User.id < 3, User.name == '刘亦菲').all() # 等同于上面
res = session.query(User).filter(or_(User.id < 2, User.name == 'eric')).all()
res = session.query(User).filter(
or_(
User.id < 2,
and_(User.name == '刘亦菲', User.id > 3),
User.extra != ""
)).all()
# 通配符,以e开头,不以e开头
res = session.query(User).filter(User.email.like('%@%')).all()
# select user.id from user where user.name not like e%;
res = session.query(User.id).filter(~User.name.like('e%'))
print(res)
# 分页# 一页2条,查第5页
res = session.query(User)[2*5:2*5+2]
# 排序,根据name降序排列(从大到小)
res = session.query(User).order_by(User.email.desc()).all()
res = session.query(Book).order_by(Book.price.desc()).all()
res = session.query(Book).order_by(Book.price.asc()).all()
# 第一个条件重复后,再按第二个条件升序排
res = session.query(User).order_by(User.name.desc(), User.id.asc())
# 分组查询 5个聚合函数from sqlalchemy.sql import func
res = session.query(User).group_by(User.extra) # 如果是严格模式,就报错# 分组之后取最大id,id之和,最小id 和分组的字段
res = session.query(
User.extra,
func.max(User.id),
func.sum(User.id),
func.min(User.id)).group_by(User.extra).all()
for item in res:
print(item[2])
# having 过滤# select max(id),sum(id),min(id) from user group by user.extra having id_max>2;
res = session.query(
func.max(User.id),
func.sum(User.id),
func.min(User.id)).group_by(User.extra).having(func.max(User.id) > 2)
from model2 import Girl,Boy,Boy2Girl
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session
from sqlalchemy.sql import text
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/aaa",)
Session = sessionmaker(bind=engine)
session = scoped_session(Session)
# 新增
girl = Girl(name='迪丽热巴')
boy = Boy(name='李现')
session.add_all([girl,boy])
session.add(Boy2Girl(girl_id=1,boy_id=1))
session.commit()
# 使用relationship
boy = Boy(name='lqz')
boy.girls = [Girl(name='杨颖'), Girl(name='白敬亭')]
session.add(boy)
session.commit()
# 基于对象的跨表查询# 正向
boy = session.query(Boy).filter(Boy.id==1).first()
print(boy.girls)
# 反向
girl = session.query(Girl).filter(Girl.id==1).first()
print(girl.boys)
连表查询
### 关联关系,基于连表的跨表查询from models1 import Person,Hobby
# 链表操作# select * from person,hobby where person.hobby_id=hobby.id;
res = session.query(Person, Hobby).filter(Person.hobby_id == Hobby.id).all()
# 自己连表查询# join表,默认是inner join,自动按外键关联# select * from Person inner join Hobby on Person.hobby_id=Hobby.id;
res = session.query(Person).join(Hobby).all()
#isouter=True 外连,表示Person left join Favor,没有右连接,反过来即可# select * from Person left join Hobby on Person.hobby_id=Hobby.id;
res = session.query(Person).join(Hobby, isouter=True).all()
# 没有right join,通过这个实现
res = session.query(Hobby).join(Person, isouter=True).all()
# # 自己指定on条件(连表条件),第二个参数,支持on多个条件,用and_,同上# select * from Person left join Hobby on Person.id=Hobby.id;
res = session.query(Person).join(Hobby, Person.hobby_id == Hobby.id, isouter=True)
# 多对多关系连表# 多对多关系,基于链表的跨表查#方式一:直接连
res = session.query(Boy, Girl,Boy2Girl).filter(Boy.id == Boy2Girl.boy_id,Girl.id == Boy2Girl.girl_id).all()
# 方式二:join连
res = session.query(Boy).join(Boy2Girl).join(Girl).filter(Person.id>=2).all()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了