Sqlite 炼金术:如何改变表格结构?

Sqlite 炼金术:如何改变表格结构?,sqlite,flask,flask-sqlalchemy,Sqlite,Flask,Flask Sqlalchemy,我有一个烧瓶应用程序中的表格模型: 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, nu

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

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.claute\u 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\u 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应用程序处理SQLAlchemy数据库迁移

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

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

请参见

使用烧瓶迁移:

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
如果迁移时出现此错误:“目标数据库不是最新的。”

修复MIGRATIONS文件夹错误的步骤:如果出于某种原因或其他类型的问题手动更新数据库,则可能会发生这种情况

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