当前位置: 首页 > 知识库问答 >
问题:

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

谭翰海
2023-03-14

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

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

共有2个答案

慕容品
2023-03-14

使用烧瓶迁移:

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

修复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
杭泉
2023-03-14

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

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

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

还可以执行原始SQLALTERTABLE语句。

请参阅如何在烧瓶中执行原始SQL

 类似资料:
  • 这是一个老少皆宜的偏旁造汉字的游戏,锅巴觉得很适合小学生玩,可以帮助他们认字、识字。

  • 我有两个主要的表,这是角色和用户,和用户我做3表操作员,教师和学生的关联。 到目前为止,我是这样做的: 但我得到了这个错误信息: 正在尝试将类型为的项刷新为集合“Role.users”的成员。应为类型为的对象或此类型的多态子类。如果是的子类,请配置映射器“mapper | User | users”以多态方式加载此子类型,或设置enable_typechecks=False以允许接受任何子类型进行

  • 假设我有一个模型,其中包含字段和。我想做以下查询: 在SQLAlchemy中,对于单一的一个,这是有效的: 我是否应该添加另一个?或者将和都放在我当前的? 我希望在上优先订购。

  • 我试图执行原始sql查询在我的python应用程序使用heroku数据库.我已经通过运行一个脚本单独创建表 我将数据库配置如下: 当我执行INSERT INTO命令时,我得到一个错误。错误 插入查询:

  • 我有一个图形,我想在文本周围显示一个边框。对于添加或删除边框,我的代码工作了一次,但是我的事件mouseEnter/mouseLeave工作了多次。这是为什么? 所有BarChart(Recharts API): 显示我需要将边框放置在其上的条形图旁边的文本的代码:

  • 问题内容: http://play.golang.org/p/wYgfLLQYdm 请参阅上面的示例。在我的示例中,方法执行后变量更改不会持续。如何使用struct方法更改struct变量的值? 问题答案: 您的方法接收者是一个值,而不是一个指针。 那意味着那些方法像操作对象的 副本 。 也可以看看: 常见问题“ 我应该在值或指针上定义方法吗? ”。 “ 在Golang中不要被指针与非指针方法接收