2014-03-27 17 views
1

我正在Heroku上运行Django 5.1 Web应用程序,并保留用户数据。Django 1.5:如何使用South向现有表添加新模型字段而不必删除表?

在本地,我只是给现有模型添加了一个新的char字段,并且当我推送到Heroku时不想破坏任何内容。我知道Django 6引入了一个migrate命令,但是Django 5没有这样的东西。我只有South迁移工具。

我试图在本地(在我的sqlite3数据库上)关注South basic tutorial,以确保在Heroku上运行'真正'时不会破坏任何内容。一切都打破了......

(venv)$ python manage.py migrate forecasts 
Running migrations for forecasts: 
- Migrating forwards to 0002_auto__add_field_day_weather. 
> forecasts:0001_initial 
FATAL ERROR - The following SQL query failed: CREATE TABLE "forecasts_region" ("id" integer NOT NULL PRIMARY KEY, "url" varchar(200) NOT NULL UNIQUE, "name" varchar(200) NOT NULL, "nickname" varchar(10) NOT NULL) 
The error was: table "forecasts_region" already exists 
! Error found during real run of migration! Aborting. 

! Since you have a database that does not support running 
! schema-altering statements in transactions, we have had 
! to leave it in an interim state between migrations. 

! You *might* be able to recover with: = DROP TABLE "forecasts_region"; [] 
    = DROP TABLE "forecasts_day"; [] 
    = DROP TABLE "forecasts_tide"; [] 

! The South developers regret this has happened, and would 
! like to gently persuade you to consider a slightly 
! easier-to-deal-with DBMS (one that supports DDL transactions) 
! NOTE: The error which caused the migration to fail is further up. 
Error in migration: forecasts:0001_initial 
DatabaseError: table "forecasts_region" already exists 

我被迫DROP这三个表,然后重新运行python manage.py syncdb,然后python manage.py migrate forecasts。这增加了新的字段,但我在这三个表中丢失了所有的数据。

我是害怕在现场版本上弄乱了事情,所以请问,我该怎么做,按什么顺序?如果您可以包含最佳做法,为了防止出现问题而保留数据,我们将不胜感激。另外,请握住我的手,因为我从未使用过South。谢谢!

回答

4

您在使用Django South进行数据库迁移时是正确的。上面运行的问题是您已经在数据库中创建了表。 South允许您在第一次运行迁移时执行“假”迁移,因此它不会尝试创建已存在的表。

你可以试着南方命令为现有应用转换为南方,这里http://south.readthedocs.org/en/latest/convertinganapp.html#converting-an-app解释,或尝试以下操作:

  1. 在数据库中创建的所有表。我们是把这个当你第一次启动您的项目

    python manage.py syncdb 
    
  2. 创建南初始迁移

    python manage.py schemamigration --initial forecasts 
    
  3. 应用它作为一个假冒迁移

    python manage.py migrate forecasts --fake 
    
  4. 进行更改到预测模型。

  5. 创建迁移新变化

    python manage.py schemamigration --auto forecasts 
    
  6. 应用,移民,现在就只能单alter命令

    python manage.py migrate forecasts 
    
+0

是的,我忽略了运行'./manage.py convert_to_south myapp'。考虑到提供的错误信息,您认为这是问题吗?这似乎与我使用sqlite3数据库的事实有关。此外,有关如何备份我的数据,以防万一出现问题的任何提示? – sgarza62

0

好吧,我想我找到了在本地和在Heroku上使用South的好的分步过程(从此blog):

  • 打开设置。PY,并添加 '南' 到你的INSTALLED_APPS列表
    • 运行执行syncdb本地:
      • python django_project/manage.py syncdb
  • 转换项目中使用南:
    • python django_project/manage.py convert_to_south django_app
  • 添加了一些新的领域django_project/django_app/models.py
  • 设置模式:
    • python django_project/manage.py schemamigration django_app --auto
  • 执行迁移:
    • python django_project/manage.py migrate django_app
  • 添加South Heroku项目的requirements.txt文件。例如:
    • South==0.7.3
  • 加入南方django_project /迁移目录版本控制 并提交所有更改。
  • 把你的改变的Heroku:
    • git push heroku master
  • 运行执行syncdb在Heroku:
    • heroku run bin/python django_project/manage.py syncdb
  • 转换django_app您的Heroku实例用南
    • heroku run bin/python django_project/manage.py convert_to_south django_app
  • 执行迁移:
    • heroku run bin/python django_project/manage.py migrate django_app

以防万一,你可以备份在Heroku Postgres的数据库,如所述使用PG Backups plugin d here

相关问题