【问题标题】:Trouble using South with Django and Heroku在 Django 和 Heroku 中使用 South 时遇到问题
【发布时间】:2012-04-25 12:17:33
【问题描述】:

我有一个现有的 Django 项目,我刚刚将 South 添加到。

  • 我在本地运行了 syncdb。
  • 我在本地运行manage.py schemamigration app_name
  • 我在本地运行manage.py migrate app_name --fake
  • 我提交并推送给 heroku master
  • 我在 heroku 上运行了 syncdb
  • 我在 heroku 上运行 manage.py schemamigration app_name
  • 我在 heroku 上运行 manage.py migrate app_name

然后我收到这个:

$ heroku run python notecard/manage.py migrate notecards
Running python notecard/manage.py migrate notecards attached to terminal... up, run.1
Running migrations for notecards:
 - Migrating forwards to 0005_initial.
 > notecards:0003_initial
Traceback (most recent call last):
  File "notecard/manage.py", line 14, in <module>
    execute_manager(settings)
  File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/app/lib/python2.7/site-packages/south/management/commands/migrate.py", line 105, in handle
    ignore_ghosts = ignore_ghosts,
  File "/app/lib/python2.7/site-packages/south/migration/__init__.py", line 191, in migrate_app
    success = migrator.migrate_many(target, workplan, database)
  File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 221, in migrate_many
    result = migrator.__class__.migrate_many(migrator, target, migrations, database)
  File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 292, in migrate_many
    result = self.migrate(migration, database)
  File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 125, in migrate
    result = self.run(migration)
  File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 99, in run
    return self.run_migration(migration)
  File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 81, in run_migration
    migration_function()
  File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 57, in <lambda>
    return (lambda: direction(orm))
  File "/app/notecard/notecards/migrations/0003_initial.py", line 15, in forwards
    ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
  File "/app/lib/python2.7/site-packages/south/db/generic.py", line 226, in create_table
    ', '.join([col for col in columns if col]),
  File "/app/lib/python2.7/site-packages/south/db/generic.py", line 150, in execute
    cursor.execute(sql, params)
  File "/app/lib/python2.7/site-packages/django/db/backends/util.py", line 34, in execute
    return self.cursor.execute(sql, params)
  File "/app/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute
    return self.cursor.execute(query, args)
django.db.utils.DatabaseError: relation "notecards_semester" already exists

我有 3 个模型。部分、学期和记事卡。我在 Notecards 模型中添加了一个字段,但无法在 Heroku 上添加它。

谢谢。

【问题讨论】:

    标签: python django heroku


    【解决方案1】:

    您必须伪造创建表的迁移,然后照常运行其他迁移。

    manage.py migrate app_name 000X --fake
    manage.py migrate app_name 
    

    000X 是您在其中创建表的迁移编号。

    【讨论】:

    • 当我在 heroku 上运行 manage.py migrate app_name 0005 --fake 时。然后运行manage.py migrate app_name,我收到Nothing to migrate. Loading initial data for app_name. No fixtures found.
    • 好吧,你的迁移完全搞砸了。除非我们从迁移之前开始,完整地了解您在开发和产品上所做的事情,否则很难为您提供帮助。我们需要细节。其中很多。给我们你写的所有代码,然后你所做的所有修改,你运行的所有迁移命令,以及在哪台机器上。整个列表。
    • 谢谢。我可以做这个。一件事可能会让事情变得更容易......我只对代码中的模型进行了一次更改 - 我向单个模型添加了一个字段。我可以轻松地删除该字段并恢复到南前数据库的原始状态。如果我这样做,我可以删除迁移文件夹并重新开始 - 正确的方法吗?如果没有,我会收集尽可能多的信息。谢谢!
    • 是的,你可以。删除字段。删除迁移文件夹。重置迁移数据库(manage.py flushdb south)。然后创建初始迁移(manage.py schemamigration --initial),假应用它(manage.py migrate --fake)。添加该字段,并创建真正的迁移(manage.py schemamigration --auto)然后应用(manage.py migrate)。
    • 太棒了。容易得多。可以肯定的是,按照您上面的说明,我在本地还是在 Heroku 上完成所有这些操作?很抱歉很烦人,我试图确保这次我正确地做到了这一点,因为我遵循的教程没有正确引导我,或者我在某些时候搞砸了。再次感谢您。
    【解决方案2】:

    首先,从 0003_initial 和 0005_initial 的外观来看,您已经完成了多个添加 create_table 语句的 schemamigration myapp --initial 命令。拥有两组这些肯定会导致问题,因为一组会创建表,然后下一组会尝试创建现有表。

    您的migrations 文件夹可能完全被奇怪的迁移污染了。

    无论如何,虽然我了解在本地机器和远程机器上运行 schemamigration 的理论,但这可能是您问题的根源。 Schemamigration 生成一个新的迁移 - 如果您必须在您的开发服务器上运行它、提交它、推送它,然后在您的生产机器上再生成一个,那么您可能最终会遇到重叠迁移。

    另一件事:如果您在远程计算机上运行 syncdb 并且它正在生成表,这意味着您的数据库是 100% 最新的——不需要迁移。你会做一个完整的migrate --fake 来匹配你的迁移到你的数据库。

    I ran syncdb locally.
    I ran manage.py schemamigration app_name locally
    I ran manage.py migrate app_name --fake locally
    I commit and pushed to heroku master 
    I ran syncdb on heroku 
    
    I ran manage.py schemamigration app_name on heroku
    # if you ran syncdb, your DB would be in the final state.
    I ran manage.py migrate app_name on heroku
    # if you ran syncdb, your DB would be in the final state. Nothing to migrate.
    

    【讨论】:

    • 谢谢。虽然您的解释很好地说明了问题是如何发生的,但我仍然坚持如何在这一点上实际解决问题。你说如果我运行syncdb,我的数据库将处于最终状态——它不是。如果我将 Heroku 上的迁移伪造为 0005(最终状态),然后再次运行迁移,我会收到 Nothing to migrate. Loading initial data for app_name. No fixtures found.
    猜你喜欢
    • 2023-03-31
    • 2020-08-07
    • 1970-01-01
    • 2019-02-18
    • 2019-12-08
    • 2013-08-17
    • 1970-01-01
    • 2021-12-27
    • 2019-05-28
    相关资源
    最近更新 更多