zoukankan      html  css  js  c++  java
  • 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提交才能对数据操作成功

    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/randysun/p/15518312.html
Copyright © 2011-2022 走看看