我在烧瓶应用程序中有一个表格模型:
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(80), nullable=False)
body = db.Column(db.Text, nullable=False)
pubDate = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now())
我使用
db.crate_all()
和db.add()
/db.session
向上表添加一些数据,效果很好!
然后我想更新并添加类 Article 的一些属性:
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(80), nullable=False)
body = db.Column(db.Text, nullable=False)
createDate = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now())
touchDate = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now())
publishDate = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now())
isVisible = db.Column(db.Boolean, nullable=False, default=True)
isDraft = db.Column(db.Boolean, nullable=False, default=True)
更新课程文章后,我再次使用
db.create_all()
。当我运行 Flask 应用程序时,我收到以下错误消息:
cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: article.createDate
[SQL: SELECT article.id AS article_id, article.title AS article_title, article.body AS article_body, article."createDate" AS "article_createDate", article."touchDate" AS "article_touchDate", article."publishDate" AS "article_publishDate", article."isVisible" AS "article_isVisible", article."isDraft" AS "article_isDraft"
FROM article
WHERE article."isVisible" = 1]
每当我更改
db.Model
子类时,数据库中的表是否会自动同步? db.Model
子类的属性改变后需要做什么操作?
对于工业级解决方案,Flask-Migrate 是一个扩展,可使用 Alembic 处理 Flask 应用程序的 SQLAlchemy 数据库迁移。
Alembic是SQLAlchemy的作者编写的数据库迁移工具。迁移工具提供以下功能:
- 可以向数据库发出 ALTER 语句以更改表的结构和其他构造
- 提供一个可以构建“迁移脚本”的系统;每个脚本指示一系列特定的步骤,可以将目标数据库“升级”到新版本,并且可选地一系列可以类似地“降级”的步骤,以相反的方式执行相同的步骤。
- 允许脚本以某种顺序方式执行。
也可以执行原始 SQL
ALTER TABLE
语句。
使用 Flask 迁移:
1-您需要添加将处理迁移的manage.py。
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from app import app, db
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
2 - 在 models.py 中进行更改后运行以下命令
- python manage.py db init #creates the migration folder (one time only)
- python manage.py db migrate
#Choose one of both options :
- python manage.py db upgrade # update the db automatically
- python manage.py db upgrade --sql > migration.sql # update the "migration.sql" file with the updated sql script.
在开发模式下,通常在对模型进行新的更改后需要一一运行这两个命令:
python manage.py db migrate
python manage.py db upgrade
如果迁移时出现此错误:“目标数据库不是最新的。”
python manage.py db stamp head
python manage.py db migrate
python manage.py db upgrade
修复迁移文件夹错误的步骤:如果您由于某种原因或其他类型的问题手动更新数据库,则可能会发生这种情况。
drop table alembic_version #sql command to run in front of the db )
delete migrations folder #manually from the project tree
python manage.py db init
python manage.py db migrate
python manage.py db upgrade