Python 与Django和Heroku一起使用South时遇到问题

Python 与Django和Heroku一起使用South时遇到问题,python,django,heroku,Python,Django,Heroku,我有一个现有的Django项目,我刚刚加入了South 我在本地运行了syncdb 我在本地运行了manage.py schemamigration应用程序\u name 我在本地运行了manage.py migrate app\u name--false 我向希罗库大师承诺并推送他 我在heroku上运行了syncdb 我在heroku上运行了manage.py schemamigration应用程序\u name 我在heroku上运行了manage.py migrate app\u na

我有一个现有的Django项目,我刚刚加入了South

  • 我在本地运行了syncdb
  • 我在本地运行了
    manage.py schemamigration应用程序\u name
  • 我在本地运行了
    manage.py migrate app\u name--false
  • 我向希罗库大师承诺并推送他
  • 我在heroku上运行了syncdb
  • 我在heroku上运行了
    manage.py schemamigration应用程序\u name
  • 我在heroku上运行了
    manage.py migrate app\u 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
$heroku运行python记事卡/manage.py迁移记事卡
正在运行python记事卡/manage.py迁移附加到终端的记事卡。。。起来,跑
运行记事卡迁移:
-正向迁移到0005_首字母。
>备注卡:0003_首字母
回溯(最近一次呼叫最后一次):
文件“notecard/manage.py”,第14行,在
执行\u管理器(设置)
文件“/app/lib/python2.7/site packages/django/core/management/_init__.py”,第438行,在执行管理器中
utility.execute()
文件“/app/lib/python2.7/site packages/django/core/management/_init__.py”,第379行,在execute中
self.fetch_命令(子命令)。从_argv(self.argv)运行_
文件“/app/lib/python2.7/site packages/django/core/management/base.py”,第191行,在运行时从
self.execute(*args,**选项._dict__;
文件“/app/lib/python2.7/site packages/django/core/management/base.py”,第220行,在execute中
输出=self.handle(*args,**选项)
文件“/app/lib/python2.7/site packages/south/management/commands/migrate.py”,第105行,在handle中
忽略重影=忽略重影,
文件“/app/lib/python2.7/site packages/south/migration/_init__.py”,第191行,在migrate_应用程序中
success=migrator.migrate\u many(目标、工作计划、数据库)
文件“/app/lib/python2.7/site packages/south/migration/migrators.py”,第221行,在migrate\u many中
结果=迁移器。\类\迁移\多个(迁移器、目标、迁移、数据库)
文件“/app/lib/python2.7/site packages/south/migration/migrators.py”,第292行,在migrate\u many中
结果=self.migrate(迁移,数据库)
文件“/app/lib/python2.7/site packages/south/migration/migrators.py”,第125行,在migrate中
结果=self.run(迁移)
文件“/app/lib/python2.7/site packages/south/migration/migrators.py”,第99行,运行中
返回self.run\u迁移(迁移)
文件“/app/lib/python2.7/site packages/south/migration/migrators.py”,第81行,运行时迁移
迁移函数()
文件“/app/lib/python2.7/site packages/south/migration/migrators.py”,第57行,在
返回(λ:方向(orm))
文件“/app/notecard/notecards/migrations/0003_initial.py”,第15行,向前
('user',self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.user']),
文件“/app/lib/python2.7/site packages/south/db/generic.py”,第226行,在create_表中
“,”。联接([col for columns in columns if col]),
文件“/app/lib/python2.7/site packages/south/db/generic.py”,执行中的第150行
cursor.execute(sql,params)
文件“/app/lib/python2.7/site packages/django/db/backends/util.py”,执行中的第34行
返回self.cursor.execute(sql,params)
文件“/app/lib/python2.7/site packages/django/db/backends/postgresql_psycopg2/base.py”,执行中的第44行
返回self.cursor.execute(查询,参数)
django.db.utils.DatabaseError:关系“记事本”已存在
我有三种型号。章节、学期和记事本。我在记事卡模型中添加了一个字段,但在Heroku上无法添加该字段


谢谢。

您必须伪造创建表的迁移,然后像往常一样运行其他迁移

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

000X是您创建表的迁移次数。

首先,从0003\u initial和0005\u initial的外观来看,您已经执行了多个
schemamigration myapp--initial
命令来添加create\u table语句。拥有两组这样的表肯定会导致问题,因为其中一个将创建表,而下一个将尝试创建现有表

您的
migrations
文件夹可能已被奇数迁移完全污染

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

另一件事:如果您在远程计算机上运行syncdb,并且它正在生成表,这意味着您的数据库是100%最新的——不需要迁移。您需要执行完整的
迁移--false
,以将迁移与数据库相匹配

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.

当我在heroku上运行manage.py迁移应用程序_name 0005——false时。然后运行manage.py migrate app_name,我没有收到任何要迁移的内容。正在加载应用程序名称的初始数据。找不到固定装置。好的,您的迁移完全搞砸了。除非我们有您在dev和prod上所做的全部历史记录,否则我们将很难帮助您,从第一次迁移之前开始。我们需要细节。很多。给我们你写的所有代码,然后是你做的所有修改,你运行的所有迁移命令,以及在哪台机器上。全部名单,谢谢。我能做到。有一件事可能会让事情变得更容易。。。我只对代码中的模型做了一个更改——我在单个模型中添加了一个字段。我可以很容易地删除这个字段,并恢复到数据库的原始状态。如果我这样做,我可以删除migrations文件夹并重新开始吗?正确的方法?如果没有,我会收集尽可能多的信息。谢谢是的,你可以。删除该字段。删除迁移文件夹。重置迁移数据库(manage.py flushdb south)。然后创建初始迁移(manage.py schemamigration--initial),假应用它(manage.py migrate--false)。添加字段,然后单击cr