Flask-SQLAlchemy:如何更改表结构?

问题描述 投票:0回答:2

我在烧瓶应用程序中有一个表格模型:

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
子类的属性改变后需要做什么操作?

python flask flask-sqlalchemy flask-migrate
2个回答
3
投票

对于工业级解决方案,Flask-Migrate 是一个扩展,可使用 Alembic 处理 Flask 应用程序的 SQLAlchemy 数据库迁移。

Alembic是SQLAlchemy的作者编写的数据库迁移工具。迁移工具提供以下功能:

  • 可以向数据库发出 ALTER 语句以更改表的结构和其他构造
  • 提供一个可以构建“迁移脚本”的系统;每个脚本指示一系列特定的步骤,可以将目标数据库“升级”到新版本,并且可选地一系列可以类似地“降级”的步骤,以相反的方式执行相同的步骤。
  • 允许脚本以某种顺序方式执行。

也可以执行原始 SQL

ALTER TABLE
语句。

参见 如何在 Flask-SQLAlchemy 应用程序中执行原始 SQL


3
投票

使用 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
© www.soinside.com 2019 - 2024. All rights reserved.