Python Can';t使用Flask migrate(Alembic)迁移或升级数据库

Python Can';t使用Flask migrate(Alembic)迁移或升级数据库,python,flask,sqlalchemy,alembic,flask-migrate,Python,Flask,Sqlalchemy,Alembic,Flask Migrate,我一直在使用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 A

我一直在使用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
时,我得到了最新的数据库版本


有解决办法吗?谢谢。

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


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

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

alembic.util.CommandError:目标数据库未更新

你能试试下面的步骤吗

python manage.py db stamp head
python manage.py db migrate
python manage.py db upgrade
在修订表上加盖给定修订的“印章”;不要运行任何迁移


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

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

听起来您有一个尚未运行的迁移(坏迁移)。编辑它使其正确,或者删除它并再次生成迁移。如何删除迁移?迁移只是文件。您只需删除该文件。Flask Migrate通常将它们存储在
migrations/version
中。我找到了最新的迁移文件并将其删除,但是当我尝试运行迁移时,我仍然设法获得
目标数据库不是最新的。
我所做的正是:)我遇到了同样的问题,您的解决方案也起了作用,但我对一件事感到困惑。实际上,我无意中运行了两次相同的migrate命令,因此在migrations/versions文件夹中,创建了两个相同的迁移,第一个迁移实际上反映了模型上的更改,第二个迁移为空。你认为我是因为这个才有这个问题的吗?因为当我检查alembic_版本时,数字与第一次迁移匹配,但与第二次迁移不匹配。这应该不会导致问题,因为如果打开第二次迁移脚本,您将看到它实际上没有做任何事情。如果你是OCD(和我一样),你可以删除不需要的第二个迁移文件。只需确保
alembic\u version.version\u num
的值与第一个(正确的)迁移脚本的文件名匹配。这种方法最终对我有效。我的alembic_versions表为空,因此我继续手动插入最新迁移文件名的值,并且migrate命令有效:)我在尝试复制此解决方案时遇到困难。在本地,我没有此问题。
错误[root]错误:找不到由“…”标识的修订版。
。然而,在我部署应用程序之后,任何升级Heroku上的表的尝试都是徒劳的。我已经删除了migrations文件夹和
app.db
文件,并再次运行
init
migrate
upgrade
,但我无法解决heroku错误。运行正常,我不知道它会做什么。谢谢