python Flask 操作数据库
Flask数据库
转载:Flask数据库 - 苦行僧95 - 博客园 (cnblogs.com)
Flask-SQLAlchemy
Flask-SQLAlchemy是在Flask中操作关系型数据库的拓展。是以面向模型对象的形式操作数据库,通过迁移完成建表
安装第三方库
pip install Flask-SQLAlchemy==2.2
pip install Flask-MySQLdb==0.2.0
基本配置
from flask_sqlalchemy import SQLAlchemy # 配置数据库访问链接 app.config['SQLALCHEMY_DATABASE_URI']="mysql://root:123456@127.0.0.1:3306/demo" # 设置是否追踪数据库的增删改查,一般设置为False app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Flase # 创建SQLAlchemy对象,,并与当前数据库关联,TCP连接 db = SQLAlchemy(app)
自定义模型
class Publishers(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) address = db.Column(db.String(64)) def _str_(self): # print显示内容做设置 return self.name def _repr__(self): # 对列表中显示内容做设置 return self.name
对数据库增删改查
增
#第一种方法 user = User(name="laowang", age=18) db.session.add(user) # 逻辑添加 db.session.commit() #第二种方法 user = User() user.name = "laoli" user.age = 18 db.session.add(user) # 逻辑添加 db.session.commit()
删
es = User.query.filter_by(name="laowang").first() db.session.delete(es) db.session.commit()
改
es = User.query.filter_by(id=3).first() res.name="lisi"
查
模型类名.query.过滤器.查询执⾏行行器器
过滤器
返回BaseQuery类型对象 并不是最终的数据 最终的数据由 查询执行器获取
filert() 按照条件查找
比如:
User.quer.filter(User.name = "lisi")
filter_by() 按照条件精确查找
比如:
User.query.filter_by(id=1)
查询执行器
返回最终的结果
all() 返回查询到的所有结果,是一个列表, User.query.filter(User.name != 'wang').all()
first() 返回查询的第一个结果,User.query.filter(User.name != 'wang').first()
get() 返回主键对应的行, User.query.get(1)
count() 返回查询结果的数量 User.query.count()
paginate() 参数分别对应的是要查询的是第几页,每页几条数据,如果有错是否输出。 User.query.paginate(2, 3, False),这个例子是,每页三条数据,查询第二页的数据
关于查询的一些练习
排序
order_by()
例子:
# 正序 User.query.order_by(User.name) # 倒序 User.query.order_by(User.name.desc())
一对多关系
在说一对多关系的时候,用的是班级表和学生表,班级模型类:Class,学生模型类:Student
一查多
relationship
在一的那一方,建立跟多的那一方的关联属性
# 在班级模型类中定义 student = db.relationship("Student")
# 查询 class = Class.query.get(1) class.student
多对多关系
多对多是通过建立中间表实现的。中间表值记录关系和存储关系字段。
这个中间表将互为多对多的关系表的主键设为外键。
这个关系表是直接建立的,不适用于模型类映射
lazy属性
在一对多查询的时候,如果已经查询出一的那一方,可以决定多的那一方数据查询的时机,是在查出一后立即查出多的数据(默认),还是在使用的时候才去查询。
设置查出一就同时查出多
student = db.relationship("Student", backref = "class", lazy = "subquery")
class = Class.query.get(1)
class.student
如例子中,lazy设置为subquery之后,class.student会显示所有记录。
设置用到多是再查多
student = db.relationship("Student", backref = "class", lazy = "dynamic")
class = Class.query.get(1)
class.student
如例子中,lazy设置为subquery之后,class.student不会显示所有记录,可以用class.student[0]这样的下标取值。