SQLAlchemy相关的增&删&改&查的详细介绍
目录
1.插入数据
from database from User,db
u1 = User(username= 'john', email = 'john@example.com')
u2 = User(username= 'susan', email = 'susan@example.com')
db.session.add(u1)
db.session.add(u2)
db.session.commit()
(1)对象 = User(字段1=‘值1’,字段2=‘值2’)
相当于SQL操作INSERT INTO User VALUES(字段1=‘值1’,字段2=‘值2’),并将该SQL语句赋值到一个对象上
(2)db.session.add()
将对于数据库的操作保存在缓存中,既然是保存到缓存中,那么该数据库语句还没有提交到数据库中
(3)db.session.commit()
commit()和数据库中的commit指令一样,将数据库操作提交到数据库中。只要涉及到添加、修改、删除的都需要commit()提交
(4)如果User表多个字段,最低要求把所有为非空的字段填满,其余字段可填可不填,
2.修改数据
from database import User, db
# u = User.query.filter_by(username='john').first() # 这种方式与如下效果一致
u = db.session.query(User).filter_by(username='john').first()
# 完全等于
#u = User.query.filter_by(username='john').first()
u.email = 'john@example.vip.com'
db.session.add(u)
db.session.commit()
(1)解释:首先将对象查询出来,然后将修改的字段赋值,并将查询出的对象提交到数据库,这样更新操作就结束了。
3.删除数据
from database import User, db
# u = User.query.filter_by(username='john').first() # 效果与如下一致
u = db.session.query(User).filter_by(username='john').first()
# 完全等于
u = User.query.filter_by(username='john').first()
db.session.delete(u)
db.session.commit()
先查询出数据,然后调用delete()函数,将数据传入db对象,并提交到数据库中。
4.查询数据
(1)查询全部
from database import User, db
for user in User.query.all():
print(user.id, user.name, user.email) # 打印user表里面所有的数据
(2)精确查询
from database import User, db
# u = User.query.filter_by(username='susan').first()
u = db.session.query(User).filter_by(username='susan').first()
#完全等于:
u = User.query.filter_by(username='susan').first()
print(u.email)
(3)模糊查询
from database import User, db
# for user in User.query.filter(User.email.ilike('%example.com')).all():
for user in db.session.query(User).filter(User.email.ilike('%example.com')).all():
print(user.username, user.email)
查询用户中,所有email以example.com结尾的用户
注意,此处只能使用filter()方法
(4)filter_by()多个字段
name = "zzy"
pw = "123456"
r = db.session.query(User).filter_by(username=name, password=pw).all()[0]
- all()方法最终获取的是一个列表,如果只有一个对象,那也是一个列表,类似[“zzy”,]这样的列表,所以如果想获取对象还需要使用索引
- 如果查询的数据肯定只有一个,则可以使用first()方法代替all(),最终返回的是一个对象
(5)正序、倒叙查询order_by
r = db.session.query(User).order_by(User.id.desc()).first()
- 按照id倒序,得到最终结果的第一个
- order_by()就是原生sql里面的order_by,不会影响最终查询到的字段个数,但是query()方法,就会影响到最终查询到字段的个数,例如:
r = db.session.query(User.id).order_by(User.id.desc()).first()
例如,通过如上的方法,就只查询到id字段并倒序,输出第一个
(6)某个字段不等于某个值
r = db.session.query(User).filter(User.username!="zzy").all()
注意:此处不能使用filter_by()方法
(7)某个字段的值在列表中 & 不在列表中
查询username在某个列表里面的对象
r_new = db.session.query(Students).filter(Students.username.in_(["zhang","zzy"])).all()
print(len(r_new))
查询username不在某个列表里面的对象
r_new = db.session.query(Students).filter(Students.username.notin_(["zhang","zzy"])).all()
# r_new = db.session.query(~Students).filter(Students.username.in_(["zhang","zzy"])).all()
#下面的效果和上面一致
(8)过滤查询结果的数量–limit()
r = db.session.query(User).filter(User.id>5).limit(2).all()
查询id>5的正序列表,且只取出2个
(9)某字段为None或非None
r = db.session.query(User).filter(User.username==None).all() #为None
r = db.session.query(User).filter(User.username!=None).all() #非None
(10)某字段的值为A or B
r = db.session.query(User).filter(or_(User.username="zzy", User.username="ping").all()
(11)原生SQL执行(传递参数)
方式一:
id_new = 2
r = db.session.execute("select * from user_basic_info where id=:id", params={"id":id_new}).fetchall()
12
注意:slq语句里面传递值得时候id=:id
方式二:
id_old = 1
r = db.session.query(UserBasicInfo).from_statement("select * from user_basic_info where id=:id_new").params(id_new=id_old).all()
# id_old的值传递给params里面的id_new,然后再传递给from_statement()方法里面
信息来源:
https://blog.csdn.net/chenmozhe22/article/details/82891439