【问题标题】:Flask-SQLAlchemy: How to change table structure?Flask-SQLAlchemy:如何更改表结构?
【发布时间】:2019-12-31 17:57:58
【问题描述】:

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

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在上表中添加了一些数据,效果很好!

然后我想更新并添加文章类的一些属性:

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()。当我运行我的烧瓶应用程序时,我收到以下错误消息:

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

【问题讨论】:

    标签: sqlite flask flask-sqlalchemy


    【解决方案1】:

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

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

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

    还可以执行原始 SQL ALTER TABLE 语句。

    How to execute raw SQL in Flask-SQLAlchemy app

    【讨论】:

      【解决方案2】:

      使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        相关资源
        最近更新 更多