• [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自学吧>
  • 相关阅读:
    J Identical Trees(求俩个树转化所需的最小代价,hash判同构,费用流求转移代价)
    I Tournament(俩人一组,构造最少排队总时间)
    D
    purfer序列(有关度数与生成树个数情况)
    博客园自定义样式
    莫比乌斯知识点整理
    随笔日记
    牛客小白月赛16
    Codeforces Round #555 (Div. 3)
    Codeforces Round #553 (Div. 2)
  • 原文地址:https://www.cnblogs.com/itzixueba/p/14007923.html
Copyright © 2020-2023  润新知