python
# 之前使用的这个db.create_all()很有局限性,它不能把在class里修改的东西同步上数据库,所以不用了
# with app.app_context(): # 请求应用上下文
# db.create_all() # 把所有的表同步到数据库中去
例如,在User类中增加一个email字段:
python
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(100))
运行后在数据库中刷新并没有更新:
所以这个db.create_all()很有局限性。
下面使用新方法:
首先在命令行或者在终端输入 pip install flask-migrate 安装插件,确保是安装在与项目对应的虚拟环境,所以在终端上安装不会有问题,这里我用命令行做示范:
win + R 输入 cmd 回车,然后输入上面的指令,等待安装完即可
python
在项目开头导入才能使用
from flask_migrate import Migrate
python
db = SQLAlchemy(app)
# 创建对象,使用它来将ORM模型映射到数据库
migrate = Migrate(app, db)
在数据库中删除这2个之前存在的表,以便看出变化:
下面正式开始:
第一步:
python
# ORM模型映射成表的三步(在项目终端执行)
# 1.flask db init (类似于git仓库初始化),这步只需要执行一次
执行前:
执行后在项目中会多出一个文件夹migrations,这是迁移脚本初始化:
第二步:
python
# 2.flask db migrate 识别ORM模型的改变,生成迁移脚本
执行前,versions文件夹里面是空的:
执行后就会看到versions里面生成了脚本:
第三步:
python
# 3.flask db upgrade 运行迁移脚本,同步到数据库中
运行前数据库中为空:
运行后:
刷新数据库就可以看到同步过来的表了:
其中alembic_version是用来记录迁移脚本版本号的
此时可以看到email已经创建成功:
如果我们要新增一个字段signature:
python
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(100))
signature = db.Column(db.String(100))
分别在终端执行第二第三步就行了:
python
# 2.flask db migrate 识别ORM模型的改变,生成迁移脚本
# 3.flask db upgrade 运行迁移脚本,同步到数据库中
执行后在数据库中刷新就能看到新增的字段了:
app.py 完整代码:
python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
# MySQL所在的主机名或域名
HOSTNAME = '127.0.0.1'
# MySQL监听的端口号,默认3306
PORT = 3306
# 连接MySQL的用户名,用自己的
USERNAME = 'root'
# 连接MySQL的密码,用自己的
PASSWORD = '***'
# MySQL上创建的数据库名称
DATABASE = 'database_learn'
app.config[
'SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4'
# 在app.config中设置好连接数据库的信息
# 然后使用SQLAlchemy(app)创建一个db对象
# SQLAlchemy会自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)
# 创建对象,使用它来将ORM模型映射到数据库
migrate = Migrate(app, db)
# ORM模型映射成表的三步(在项目终端执行)
# 1.flask db init (类似于git仓库初始化),这步只需要执行一次
# 2.flask db migrate 识别ORM模型的改变,生成迁移脚本
# 3.flask db upgrade 运行迁移脚本,同步到数据库中
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(100))
signature = db.Column(db.String(100))
# 之前使用的这个db.create_all()很有局限性,它不能把在class里修改的东西同步上数据库,所以不用了
# with app.app_context(): # 请求应用上下文
# db.create_all() # 把所有的表同步到数据库中去
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()