[Flask] 01 ORM方法列表

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

更多交流,请加QQ:390351113.请备注好友来自博客园<IT自学吧>
原文地址:https://www.cnblogs.com/itzixueba/p/14007923.html