2011-10-13 91 views
1

我只是通過教程事情Django的,我跟着亦步亦趨,但我仍然得到這個錯誤每次我嘗試遷移時間:架構遷移與南(Django的)和MySQL

最初的遷移工作,但是,試圖遷移它,我得到這個:

[email protected]:/Sites/tumblog# ./manage.py migrate blog 

    Traceback (most recent call last): 
    File "manage.py", line 11, in <module> 
    execute_manager(settings) 
    File "/usr/lib/pymodules/python2.6/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/usr/lib/pymodules/python2.6/django/core/management/__init__.py", line 379, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 191, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 220, in execute 
    output = self.handle(*args, **options) 
    File "/usr/lib/pymodules/python2.6/south/management/commands/migrate.py", line 102, in handle 
    delete_ghosts = delete_ghosts, 
    File "/usr/lib/pymodules/python2.6/south/migration/__init__.py", line 202, in migrate_app 
    success = migrator.migrate_many(target, workplan, database) 
    File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 215, in migrate_many 
    result = migrator.__class__.migrate_many(migrator, target, migrations, database) 
    File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 284, in migrate_many 
    result = self.migrate(migration, database) 
    File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 121, in migrate 
    result = self.run(migration) 
    File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 95, in run 
    return self.run_migration(migration) 
    File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 77, in run_migration 
    migration_function() 
    File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 56, in <lambda> 
    return (lambda: direction(orm)) 
    File "/Site/tumblog/blog/migrations/0005_initial.py", line 17, in forwards 
    ('name', self.gf('django.db.models.fields.CharField')(max_length=255)), 
    File "/usr/lib/pymodules/python2.6/south/db/generic.py", line 210, in create_table 
    ', '.join([col for col in columns if col]), 
    File "/usr/lib/pymodules/python2.6/south/db/generic.py", line 134, in execute 
    cursor.execute(sql, params) 
    File "/usr/lib/pymodules/python2.6/django/db/backends/util.py", line 15, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/lib/pymodules/python2.6/django/db/backends/mysql/base.py", line 86, in execute 
    return self.cursor.execute(query, args) 
    File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 166, in execute 
    self.errorhandler(self, exc, value) 
    File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 35, in defaulterrorhandler 
    raise errorclass, errorvalue 
_mysql_exceptions.OperationalError: (1050, "Table 'blog_blog' already exists") 

我搜索了一圈,發現了,添加--fake將跳過這個錯誤,但它不會改變任何事情?這裏有什麼問題,我該如何解決它?

回答

1

您的遷移中實際發生了什麼?如果你得到這個錯誤,那麼簡單的create_table被調用兩次,blog_blogblog_blog在初始遷移之前已經存在於你的數據庫中(可能是從前一次嘗試創建一個永遠不會遷移到零的博客)。

如果錯誤在初始遷移完成之前發生,那麼它很可能是工件,您可以手動將它從數據庫中刪除並重試。如果初始遷移成功但稍後遷移失敗,請找到blog_blog有重複的create_table

3

您確定添加了--fake並沒有改變任何東西嗎?

​​

...或刪除表從MySQL控制檯手動「blog_blog」;)

3

的問題是,在遷移過程試圖創建的表在數據庫中存在。它們必須已經使用syncdb創建(如果您的操作是syncdb,並且以後要開始使用南方的應用),或者通過以前的遷移,您可以創建它們。

這是可疑的遷移的名字是0005_initial。什麼是遷移0001-0004在做什麼?

要解決您的問題,您應該首先確保您沒有重複的遷移(例如,0001_initial創建表,然後0005_initial會再次嘗試)。您只需要爲應用程序進行一次初始遷移,接下來應該只記錄架構的更改。

然後,從數據庫中刪除表並重新創建它們。類似的東西可能工作:

./manage.py migrate [appname] --fake 
./manage.py migrate [appname] zero 
./manage.py migrate [appname] 

如果失敗(它將,如果在遷移現有的和新表) - 那麼你必須用手在mysql控制檯中刪除表。