flask学习笔记(十四) 数据库进阶
欢迎加入知了课堂,学习flask
Python Flask系列(1)——基础:http://study.163.com/course/courseMain.htm?courseId=1004091002
Python Flask框架——全栈开发: http://study.163.com/course/courseMain.htm?courseId=1004507006
一、Flask-SQLAlchemy
Flask-SQLAlchemy是Flask的一个扩展,这个扩展包装了SQLAlchemy。使用集成了Flask的框架可以简化配置和操作!两者原理是相同的,从使用的角度来看看两者的不同。
1.安装
和其他扩展一样,Flask-SQLAlchemy也是通过pip安装
pip install flask-sqlalchemy
或者从pycharm安装
2.数据库连接:
1. 跟sqlalchemy一样,定义好数据库连接字符串DB_URI。
2. 将这个定义好的数据库连接字符串DB_URI,通过`SQLALCHEMY_DATABASE_URI`这个键放到`app.config`中。示例代码:
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
3. 使用`flask_sqlalchemy.SQLAlchemy`这个类定义一个对象,并将`app`传入进去。示例代码:
db = SQLAlchemy(app)
3.创建ORM模型:
1. 还是跟使用sqlalchemy一样,定义模型。现在不再是需要使用`delarative_base`来创建一个基类。而是使用`db.Model`来作为基类。
2. 在模型类中,`Column`、`String`、`Integer`以及`relationship`等,都不需要导入了,直接使用`db`下面相应的属性名就可以了。
3. 在定义模型的时候,可以不写`__tablename__`,那么`flask_sqlalchemy`会默认使用当前的模型的名字转换成小写来作为表的名字,并且如果这个模型的名字使用了多个单词并且使用了驼峰命名法,那么会在多个单词之间使用下划线来进行连接。
**虽然flask_sqlalchemy给我们提供了这个特性,但是不推荐使用。因为明言胜于暗喻**
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(50),nullable=False)
uid = db.Column(db.Integer,db.ForeignKey("user_model.id"))
author = db.relationship("User",backref="artiles")
4.将ORM模型映射到数据库:
db.drop_all()
db.create_all()
5. 使用session:
以后session也不需要使用`sessionmaker`来创建了。直接使用`db.session`就可以了。
6.查询数据:
如果查找数据只是查找一个模型上的数据,那么可以通过`模型.query`的方式进行查找。`query`就跟之前的sqlalchemy中的query方法是一样用的。示例代码如下:
users = User.query.order_by(User.id.desc()).all()
print(users)
二、数据库迁移
因为采用`db.create_all`在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,然后重新运行`db.craete_all`才会重新映射,这样不符合我们的需求。因此数据库迁移就是为了解决这个问题,她可以在每次修改模型后,可以通过迁移指令将修改的东西映射到数据库中。接下来介绍的是通过alembic进行数据库迁移的操作步骤。
最终要实现 ORM -> 迁移脚本 ->映射到数据库中的过程,每一个变化都有对应的指令。
1.在虚拟环境中安装alembic
pip install alembic
2.创建一个数据库、定义好自己的模型,同时使用alembic创建一个仓库
alembic init [仓库的名字,推荐使用alembic]
3.模型、迁移仓库、数据库有了,下一步就是连接他们。修改配置文件
* 在`alembic.ini`中,给`sqlalchemy.url`设置数据库的连接方式。这个连接方式跟sqlalchemy的方式一样的。
* 在`alembic/env.py`中的`target_metadata`设置模型的`Base.metadata`。但是要导入`models`,需要将models所在的路径添加到这个文件中。
import sys, os
sys.path.append( os.path.dirname( os.path.dirname( __file__ ) ) )
其中os.path.dirname(__file__)是寻找当前路径的上一级目录
4. 将ORM模型生成迁移脚本、将生成的脚本映射到数据库:
`alembic revision --autogenerate -m 'message'`
`alembic upgrade head`
PS:以后如果修改了模型,重复4、5步骤。
5.常用命令:
1. init:创建一个alembic仓库。
2. revision:创建一个新的版本文件。
3. --autogenerate:自动将当前模型的修改,生成迁移脚本。
4. -m:本次迁移做了哪些修改,用户可以指定这个参数,方便回顾。
5. upgrade:将指定版本的迁移文件映射到数据库中,会执行版本文件中的upgrade函数。如果有多个迁移脚本没有被映射到数据库中,那么会执行多个迁移脚本。
6. [head]:代表最新的迁移脚本的版本号。
7. downgrade:会执行指定版本的迁移文件中的downgrade函数。
8. heads:展示head指向的脚本文件版本号。
9. history:列出所有的迁移版本及其信息。
10. current:展示当前数据库中的版本号。
三、还是数据库迁移
Flask-Migrate是Flask的一个扩展包,里面集成了很多常用的命令封装,可以很方面的完成数据库的迁移。flask-migrate是基于Alembic进行的一个封装,并集成到Flask中,而所有的迁移操作其实都是Alembic做的,他能跟踪模型的变化,并将变化映射到数据库中。
一般我们修改数据库不会直接手动的去修改,而是去修改ORM对应的模型,然后再把模型映射到数据库中。这时候如果有一个工具能专门做这种事情,就显得非常有用了,下面介绍如何使用Flask-Migrate来完成数据库迁移!
1.安装
pip install flask-migrate
pip install flask-script
PS:flask-migrate使用命令库时需要flask-script这个插件。
2.配置
创建一个脚本文件manage.py,通过这个文件来解释一些命令
from flask_script import Manager
from zhiliao import app
from exts import db
from flask_migrate import Migrate,MigrateCommand
from models import User
manager = Manager(app)
Migrate(app,db)
manager.add_command("db",MigrateCommand)
zhiliao.py 主app文件
exts.py 存放数据库实例
flask_script、flask_migrate是两个拓展包
Migrate(app,db) 用来绑定app和db到flask_migrate的
manager.add_command("db",MigrateCommand) 添加Migrate的所有子命令到db下
manager = Manager(app) 注册一个manager对象
manager.add_command("db",MigrateCommand) 添加MigrateCommand文件下的所有命令到项目中
** 如果想要对User模型进行迁移,别忘了加上 from models import User
3.使用
flask_migrate常用命令:
1. 初始化一个环境:python manage.py db init
2. 自动检测模型,生成迁移脚本:python manage.py db migrate
3. 将迁移脚本映射到数据库中:python manage.py db upgrade
4. 更多命令:python manage.py db --help
四、补充说明
Flask-Migrate进行数据库迁移要使用到Flask-Script这个插件,因为Flask-Migrate内部有一个命令库,Flask-Script的作用是可以通过命令行的形式来操作Flask。我们也可以设计自己的命令库,
1.创建一个脚本文件db_manager.py 将这些命令单独放在一个文件中方便管理
from flask_script import Manager
db_manager = Manager()
@db_manager.command
def init():
print('迁移仓库创建完毕!')
@db_manager.command
def revision():
print('迁移脚本生成成功!')
@db_manager.command
def upgrade():
print('脚本映射到数据库成功!')
2.在mana.py中添加这些个命令
from flask_script import Manager
from zhiliao import app,BackendUser,db
from db_script import db_manager
manager = Manager(app)
manager.add_command("db",db_manager)
3.这样就可以通过命令行的形式来实现这些功能了!
4.说明
使用 manage.commad:这个方法是用来添加那些不需要传递参数的命令。
使用 manage.option:这个方法是用来添加那些需要传递参数的命令。
有几个参数就需要 写几个`option`。
五、总结
数据库学习到这里就暂时结束了!虽然把所有例程都跑了一遍,但也只是对它有一个模糊的了解,并没有深入去理解。由于时间关系,以后有进一步了解的话再过来补充,就这样吧。。期待后面的学习!
欢迎加入知了课堂,学习flask
Python Flask系列(1)——基础:http://study.163.com/course/courseMain.htm?courseId=1004091002
Python Flask框架——全栈开发: http://study.163.com/course/courseMain.htm?courseId=1004507006
文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/feit2417/article/details/80735480
- 点赞
- 收藏
- 关注作者
评论(0)