flask学习笔记(十五) --WTForms笔记

一、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`。



五、总结

数据库学习到这里就暂时结束了!虽然把所有例程都跑了一遍,但也只是对它有一个模糊的了解,并没有深入去理解。由于时间关系,以后有进一步了解的话再过来补充,就这样吧。。期待后面的学习!

猜你喜欢

转载自blog.csdn.net/feit2417/article/details/80735509
今日推荐