flask-SQLAlchemy:用于管理数据库
flask-script:利用shell命令自动导入特定对象
flask-Migrate:实现数据库迁移
自行安装,命令:pip install XXX
对象关系映射(Object-Relational-Mapping,简称ORM)
是一种为了解决面向对象和关系型数据库存在的互不匹配的现象的技术。
SQLAlchemy是一个强大的关系型数据库框架,支持多种数据库后台,不仅提供高层ORM,还支持使用数据库原生SQL。
flask-SQLAlchemy是一个flask拓展,简化在flask程序中使用SQLAlchemy的操作。
两个重要的配置
SQLALCHEMY_DATABASE_URI(用于连接数据库)
postgresql://scott:tiger@localhost/mydatabas
mysql://scott:tiger@localhost/mydatabase
oracle://scott:[email protected]:1521/sidname
sqlite:////absolute/path/to/foo.db
SQLALCHEMY_TRACK_MODIFICATIONS(如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。)
实例化:db=SQLAlchemy(app)
flask-SQLAlchemy创建的数据库实例为模型提供了一个基类以及一系列辅助类和辅助函数,可用于定义模型的结构。
定义类(模型)
继承于db.Model
类变量__tablename__定义在数据库中使用的表名
一个模型,在数据库中对应一张表
定义类变量(属性)
继承于db.Column
指定类型
列选项,例如,是否为主键,是否不能重复。
调试小建议:给每个类定义一个__repr()__方法,用于返回一个具有可读性的字符串表示模型。
一对一
外键关联
一端用外键
另一端的relationship中设定uselist=False
一对多
外键关联
多的一端用外键
少的一端用反向引用
多对多
增加关联表
变成两个原表和关联表之间分别为一对多关系
两个原表的relationship中必须制定secondary参数为关联表
创建表
db.create_all()
表名即为之前建立的模型类名
表已存在时不会更新或重新创建
插入行
对象=模型名(属性=具体值),例如(user1=User(name='"小李飞刀"))
模型的构造函数接收的参数是使用关键字参数制定的模型属性初始值。
db.session.add(XXX)或db.session.add_all(XXX,XXX,XXX)
赋值后并未立即写入数据库,要使用数据库会话管理对数据库所做的改动,会话由db.session表示
db.session.commit()
提交会话,将对象写入数据库
1:数据库会话可以保证数据库的一致性,当写入过程发生错误时,整个会话都会失败,可以避免由部分更新导致的数据库不一致
2:数据库会话可以回滚,db.session.rollback()
修改行
直接通过属性更改,例如:user1.name='许三多'
db.session.add(user1)
db.commit()
删除行
db.session.delete(user1)
db.commit()
查询行
flask-SQLAlchemy为每个模型都提供了query方法
查询所有数据:User.query.all()
使用过滤器精确查询:User.query.filter_by(Gender='male').all()
查看原生SQL,只需将query对象转化为字符串:str(User.query.all())
有些表达式,可能会进行隐含的查询,返回隐藏的query对象,需要在关系中配置lazy=“dynamic”,禁止自动查询,从而可以用query对象,添加过滤器进行精确查询
过滤器 | 说明 |
---|---|
filter() | 把过滤器添加到原查询上,返回一个新查询 |
filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |
limit | 使用指定的值限定原查询返回的结果 |
offset() | 偏移原查询返回的结果,返回一个新查询 |
order_by() | 根据指定条件对原查询结果进行排序,返回一个新查询 |
group_by() | 根据指定条件对原查询结果进行分组,返回一个新查询 |
方法 | 说明 |
---|---|
all() | 以列表形式返回查询的所有结果 |
first() | 返回查询的第一个结果,如果未查到,返回None |
first_or_404() | 返回查询的第一个结果,如果未查到,返回404 |
get() | 返回指定主键对应的行,如不存在,返回None |
get_or_404() | 返回指定主键对应的行,如不存在,返回404 |
count() | 返回查询结果的数量 |
paginate() | 返回一个Paginate对象,它包含指定范围内的结果 |
需要的包
flask-Script
Shell用于在terminal中导入实例和模型
Manager用于跟踪所有命令但并不处理
flask-Migrate
数据库迁移框架
创建对象及命令
manager = Manager(app)
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)
MigrateCommand类可以附加到flask-Script的manager对象上,本例即为,附加在db命令上
创建迁移仓库
python XXXX.py db init
该命令会自动创建migrations文件夹,所有迁移脚本都存放其中。
迁移仓库中的文件要和程序的其他文件一起纳入版本控制。
创建迁移脚本
python XXXX.py db migrate -m "提示信息"
更新数据库
python XXXX.py db upgrade