【问题标题】:Can't migrate or upgrade database with Flask-Migrate (Alembic)无法使用 Flask-Migrate (Alembic) 迁移或升级数据库
【发布时间】:2015-12-24 06:36:27
【问题描述】:

我一直在使用 Flask-Migrate (Alembic) 来更新我的数据库。我更新了我的models.py 文件,但是我犯了一个错误。我运行了迁移并去升级数据库,但是我得到了这个错误:

sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: u'\nCREATE TABLE topics (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\t`subjectID` INTEGER, \n\ttopic VARCHAR(150) NOT NULL, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(`subjectID`) REFERENCES subjects (id)\n)\n\n']

我所做的是使用 db.Text 而不是 db.Integer 作为外键。

当我尝试运行新的迁移时,我得到了这个:

alembic.util.CommandError: Target database is not up to date.

所以现在我被困住了。我无法升级数据库也无法运行迁移。我尝试使用以下方法降级到较旧的数据库版本:

python manage.py db downgrade --sql b877018671c:36949b1cca31

但是当我运行 python manage.py db current 时,我得到了最新的数据库版本。

有解决办法吗?谢谢。

【问题讨论】:

  • 听起来您有一个尚未运行的迁移(糟糕的迁移)。要么将其编辑为正确,要么将其删除并再次生成迁移。
  • 如何删除迁移?
  • 迁移只是文件。你只需要删除文件。 Flask-Migrate 通常将它们存储在 migrations/version 中。
  • 我找到了最新的迁移文件并将其删除,但是当我尝试运行迁移时,我仍然设法得到Target database is not up to date.

标签: python flask sqlalchemy alembic flask-migrate


【解决方案1】:

Alembic 将 db 版本存储在它创建的名为 alembic_version 的表中。此表包含单个字段和行 alembic_version.version_num。确保此值与migrations/version 中最新文件的文件名匹配。此版本号也包含在修订文件中的revision 变量中,该变量通常显示在文件的第 26 行。确保它与 db 版本匹配。

另一种选择是简单地删除数据库并使用 alembic 重新创建它。如果这是一个数据不重要的开发环境,那将是我的建议。

【讨论】:

  • 我遇到了同样的问题,您的解决方案有效,但我对一件事情感到困惑。实际上,我不小心运行了两次相同的迁移命令,所以在我的迁移/版本文件夹中,创建了两个相同的迁移,第一个实际上反映了我模型上的更改,第二个是空白的。你认为我有这个问题是因为这个吗?因为当我检查 alembic_version 时,该数字与第一次迁移匹配,但与第二次不匹配
  • 这应该不会造成问题,因为如果您打开第二个迁移脚本,您会发现它实际上并没有做任何事情。如果您是强迫症(像我一样),您可以删除不需要的第二个迁移文件。只需确保 alembic_version.version_num 的值与第一个(正确)迁移脚本的文件名匹配即可。
  • 这种方法最终对我有用。我的 alembic_versions 表是空的,所以我继续并手动插入了最新迁移文件名的值并且迁移命令有效:)
  • 我在尝试重现此解决方案时遇到了困难。在本地,我没有这个问题ERROR [root] Error: Can't locate revision identified by '...。但是,在我部署应用程序后,任何在 Heroku 上升级表的尝试都是徒劳的。我已经删除了迁移文件夹和app.db 文件并再次运行initmigrateupgrade,但我无法解决heroku 错误。
【解决方案2】:

我觉得接受的答案有点过于复杂。我遇到了同样的问题,我解决它的方法是简单地删除包含编码错误的迁移。无论如何,您都不需要它,因为它再次编码不正确。在migrations/versions 文件夹中找到最新的迁移,将其删除,然后再次运行迁移并升级。您不需要删除数据库中的数据只是为了迁移它。

【讨论】:

  • 正是我所做的:)
【解决方案3】:

alembic.util.CommandError: 目标数据库不是最新的。

您可以尝试以下步骤吗?

python manage.py db stamp head
python manage.py db migrate
python manage.py db upgrade

'stamp' 给定版本的版本表;不要运行任何迁移

【讨论】:

  • 有效,但我不知道它的作用。谢谢
【解决方案4】:

第一步是删除最新创建的迁移版本,然后你应该使用这些命令:

 flask db stamp head
 flask db migrate -m "newMigration"
 flask db upgrade

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 2013-07-31
    • 2014-02-24
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多