Flask数据库

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:mysql@127.0.0.1:3306/demo"
# 设置是否追踪数据库的增删改查,会有显著的开销,一般设置为False
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Flase
# 创建SQLAlchemy对象,,并与当前数据库关联,TCP连接
db = SQLAlchemy(app)

定义模型类

# 定义数据库模型
class User(db.Model):
    # 定义表名
    __tablename__ = "user"
    # 定义id为主键,必须设置id,并且必须设置成主键
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128))
    author = db.Column(db.Integer)

补充学习时常用的db命令

    # 删除表:没有实际意义,在学习的时候,可以保证每次的数据都是新的
    db.drop_all()
    # 建表:会将继承自db.Model的类在数据库中映射出一张表
    db.create_all()

增删改查

user = User(name = "lisi")
db.session.add(user)    # 将user添加到这个TCP会话当中,这个session就代表这个链接会话

或者

user = User()
user.name = "lisi"

然后提交

db.session.commit()

注意:在Django中,使用user.save()

user = User.query.get(1)
db.session.delete(user)
db.session.commit()

user = User.query.get(1)
user.name = "lisi"
db.session.commit()

语法:

模型类名.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

多查一

backref

给relationship的第一个参数对应的模型类,添加反向引用,方便Student通过反向引用查询到Class

# 在班级模型类中定义
students = db.relationship("Student", backref = "class")
# 查询
student = Student.query.get(1)
student.class

多对多关系

多对多是通过建立中间表实现的。中间表值记录关系和存储关系字段。

这个中间表将互为多对多的关系表的主键设为外键。

这个关系表是直接建立的,不适用于模型类映射

# 比如有两个表,一个是教师表,一个是学生表,两者是多对多关联

# 在教师表中
teacher = db.relationship("Teacher", secondary = tb_student_student, backref="student", lazy="dynamic")

#建立多对多表
teacher_student = db.Table("tb_student_teacher",        # 定义名字
                           db.Column("student_id", db.Integer, db.ForeignKey("students.id")),
                           db.Column("teacher_id", db.Integer, db.ForeignKey("teachers.id")),
                           )
View Code

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]这样的下标取值。

 

posted @ 2018-05-26 17:21  苦行僧95  阅读(341)  评论(0编辑  收藏  举报