瓶中orm增删改查操作
flask中orm增删改查操作
一、创建表
# model.py
导入日期时间
从sqlalchemy导入创建引擎
来自sqlalchemy。延伸文件系统声明性导入声明性基
从结构化查询语言架构导入列、整数、字符串、文本、外键、日期时间、唯一约束、索引
来自sqlalchemy.orm导入关系
Base=declarative_base()
# make_declarative_base
类别用户(基本):
__tablename__='users' #数据库表名称
id=列(整数,主键=真)# id主键
名称=列(字符串(32),索引=真,可空=假)#名称列,索引,不可为空
年龄=列(整数)
电子邮件=列(字符串(32),唯一=真)
# datetime.datetime.now不能加括号,加了括号,以后永远是当前时间
ctime=列(日期时间,默认值=datetime.datetime.now)
额外=列(文本,可空=真)
def __repr__(自我):
返回自我名称
__table_args__=(
UniqueConstraint('id ',' name ',name='uix_id_name '),#联合唯一
索引(' ix_id_name ',' name ',' email ',#索引
)
男生班(基地):
__tablename__='boy '
id=列(整数,主键=真,自动增量=真)
名称=列(字符串(64),唯一=真,可空=假)
# 与生成表结构无关,仅用于查询方便,放在哪个单表中都可以
女孩=关系('女孩,次要='男孩2个女孩,背景='男孩)
def init_db():
'''
根据类创建数据库表
:return:
'''
引擎=create_engine(
MySQL pymysql ://root : root @ 127。0 .0 .1:3306/db _ flashkcharset=utf8 ',
max_overflow=0,#超过连接池大小外最多创建的连接
pool_size=5,#连接池大小
pool_timeout=30,#池中没有线程最多等待的时间,否则报错
pool_recycle=-1 #多久之后对线程池中的线程进行一次连接的回收(重置)
)
Base.metadata.create_all(引擎)
def drop_db():
'''
根据类删除数据库表
:return:
'''
引擎=create_engine(
MySQL pymysql ://root : root @ 127。0 .0 .1:3306/db _ flashkcharset=utf8 ',
max_overflow=0,#超过连接池大小外最多创建的连接
pool_size=5,#连接池大小
pool_timeout=30,#池中没有线程最多等待的时间,否则报错
pool_recycle=-1 #多久之后对线程池中的线程进行一次连接的回收(重置)
)
Base.metadata.drop_all(引擎)
if __name__=='__main__':
# 创建表
init_db()
# 删除表
# drop_db()
二、增加数据
来自sqlalchemy.orm导入sessionmaker
从sqlalchemy导入创建引擎
从模型导入U
sers
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.230890.com/zhan/74730.html