• flask中orm增删改查操作


    flask中orm增删改查操作

    一、创建表

    # model.py
    import datetime
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
    from sqlalchemy.orm import relationship
    
    Base = declarative_base()
    
    
    # make_declarative_base
    
    class Users(Base):
        __tablename__ = 'users'  # 数据库表名称
        id = Column(Integer, primary_key=True)  # id 主键
        name = Column(String(32), index=True, nullable=False)  # name列,索引,不可为空
        age = Column(Integer)
        email = Column(String(32), unique=True)
        # datetime.datetime.now不能加括号,加了括号,以后永远是当前时间
        ctime = Column(DateTime, default=datetime.datetime.now)
        extra = Column(Text, nullable=True)
    
        def __repr__(self):
            return self.name
    
    
        __table_args__ = (
            UniqueConstraint('id', 'name', name='uix_id_name'), #联合唯一
            Index('ix_id_name', 'name', 'email'), #索引
        )
    
    
    
    class Boy(Base):
        __tablename__ = 'boy'
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(64), unique=True, nullable=False)
    
        # 与生成表结构无关,仅用于查询方便,放在哪个单表中都可以
        girl = relationship('Girl', secondary='boy2girl', backref='boys')
    
    
    def init_db():
        """
        根据类创建数据库表
        :return:
        """
        engine = create_engine(
            "mysql+pymysql://root:root@127.0.0.1:3306/db_flask?charset=utf8",
            max_overflow=0,  # 超过连接池大小外最多创建的连接
            pool_size=5,  # 连接池大小
            pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
            pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
        )
    
        Base.metadata.create_all(engine)
    
    
    def drop_db():
        """
        根据类删除数据库表
        :return:
        """
        engine = create_engine(
            "mysql+pymysql://root:root@127.0.0.1:3306/db_flask?charset=utf8",
            max_overflow=0,  # 超过连接池大小外最多创建的连接
            pool_size=5,  # 连接池大小
            pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
            pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
        )
    
        Base.metadata.drop_all(engine)
    
    
    if __name__ == '__main__':
        # 创建表
        init_db()
    
        # 删除表
        # drop_db()
    

    二、增加数据

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from model import Users
    
    engine = create_engine("mysql+pymysql://root:root@127.0.0.1:3306/db_flask", max_overflow=0, pool_size=5)
    Session = sessionmaker(bind=engine)
    
    session = Session()
    # ################ 添加 ################
    
    # 1. 添加单条记录
    obj1 = Users(name="randy", age=10)
    session.add(obj1) # 返回及结果为none
    
    # 2. 添加多条记录
    user_obj1 = Users(name='laowang', age=14)
    user_obj2 = Users(name='laozhang', age=12)
    session.add_all([user_obj1, user_obj2])
    
    # 提交
    session.commit()
    session.close()
    

    三、删除记录

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from model import Users
    
    engine = create_engine("mysql+pymysql://root:root@127.0.0.1:3306/db_flask", max_overflow=0, pool_size=5)
    Session = sessionmaker(bind=engine)
    
    session = Session()
    ################ 删除 ################
    
    delete_num = session.query(Users).filter(Users.id == 2).delete()
    # 删除的条数
    print(delete_num)
    session.close()
    

    四、修改数据

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from model import Users
    
    engine = create_engine("mysql+pymysql://root:root@127.0.0.1:3306/db_flask", max_overflow=0, pool_size=5)
    Session = sessionmaker(bind=engine)
    
    session = Session()
    ################ 修改 ################
    # 方式一,以字典的方式修改
    res = session.query(Users).filter(Users.id==1).update({'name': 'randysun', 'age': 18})
    # 修改记录条数
    print(res)
    
    ################ 修改 ################
    
    
    # 方式一,以字典的方式修改
    # res = session.query(Users).filter(Users.id==1).update({'name': 'randysun', 'age': 18})
    # print(res)
    
    # 方式二, 类似于django的F查询
    
    # 拼接字符串需要将synchronize_session设置为 False
    res = session.query(Users).filter(Users.id == 3).update({Users.name: Users.name + 'sun'}, synchronize_session=False)
    # 修改记录条数
    print(res)
    
    # 数字增加需要将synchronize_session设置为 'evaluate'
    res1 = session.query(Users).filter(Users.id == 3).update({Users.age: Users.age + 6}, synchronize_session='evaluate')
    # 修改记录条数
    print(res1)
    
    session.commit()
    
    session.close()
    

    五、查询

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from model import Users
    
    engine = create_engine("mysql+pymysql://root:root@127.0.0.1:3306/db_flask", max_overflow=0, pool_size=5)
    Session = sessionmaker(bind=engine)
    
    session = Session()
    
    ################ 查询 ################
    # 方式一
    res = session.query(Users).all()
    res1 = session.query(Users)
    
    # 对象列表
    print(res)
    print(res[0].name, res[0].age)
    # 返回sql查询语句, 如果没有使用 .all或first就是sql语句
    print(res1)
    print(res1.all()[0].name)
    
    # 方式二,取别名,必须用别名获取数据
    
    res = session.query(Users.name.label('user_name'), Users.age.label('user_age')).all()
    res1 = session.query(Users.name.label('user_name'), Users.age.label('user_age'))
    
    print(res)
    print(res[0].user_name, res[0].user_age)
    
    # print(res[0].user, res[0].age) 报错
    
    # SELECT users.name AS user_name, users.age AS user_age FROM users
    print(res1)
    print(res1.all()[0].user_name, res1.all()[0].user_age)
    
    
    # 方式三
    
    # filter查询传入的是表达式
    res = session.query(Users).filter(Users.name == 'randy').first()
    res1 = session.query(Users).filter(Users.name == 'randy')
    print(res)
    # sql语句 两者查询sql语句一样
    print(res1)
    print(res.name)
    
    # filter_by 传入的是参数
    res_filter_by = session.query(Users).filter_by(name='randysun').first()
    res_filter_by1 = session.query(Users).filter_by(name='randysun')
    print(res_filter_by)
    # sql语句 两者查询sql语句一样
    print(res_filter_by1)
    
    print(res_filter_by.name)
    session.close()
    

    六、总结

    • query: 参数为类名则查询出来的数据是一个一个对象,如果参数为具体表字段,则查询出来的结果为具体的数据,query参数可以为其查询设置对应查询字段的别名,
    • add: 增加单条记录,参数为单条对象
    • add_all:增加多条数据,参数为对象列表
    • delete: 与查询条件filter一起连用删除具体的一条记录
    • update: 修改数据可以采用字典的形式,key为修改的字段,value要修改的值,类似django 中的F查询,但是字符串相加需要将synchronize_session 设置为True,数字相加需要将 synchronize_session设置为 ’evaluate‘
    • all:查询所有数据
    • filter:查询单条数据,参数为具体的条件表达式
    • filter_by: 查询单条数据,传入参数为具体为参数

    添加,删除,修改数据都需要commit提交才能对数据操作成功

    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    数据库范式那些事[转]
    C# 之值类型与引用类型参数[基础]
    C# 实体类生成工具
    《浅谈线程池》笔记
    提高网站性能之 —— 减少图片HTTP 请求的方案
    SQL Server 2005 For XML[学习]
    关于数据类型导致的精确计算
    SQL Server 数据库实现之TSQL语句[备忘]
    C# 关键字ref 和out 的详细区别
    关于XML中的名称空间
  • 原文地址:https://www.cnblogs.com/randysun/p/15518312.html
Copyright © 2020-2023  润新知