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提交才能对数据操作成功

在当下的阶段,必将由程序员来主导,甚至比以往更甚。
原文地址:https://www.cnblogs.com/randysun/p/15518312.html