将Django从MySQL迁移到postgresql

将Django从MySQL迁移到postgresql

问题描述:

我首先在我的一个应用程序中开始使用MySQL,现在我正在考虑从MySQL迁移到PostgreSQL。将Django从MySQL迁移到postgresql

我有南安装迁移。 当我在postgres中建立一个新的数据库时,我成功地同步了我的应用程序,并在我最后一次迁移时完全停止。

> project:0056_auto__chg_field_project_project_length 
Traceback (most recent call last): 
    File "./manage.py", line 11, in <module> 
    execute_manager(settings) 
    File "/Users/ApPeL/.virtualenvs/fundedbyme.com/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/Users/ApPeL/.virtualenvs/fundedbyme.com/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/Users/ApPeL/.virtualenvs/fundedbyme.com/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/Users/ApPeL/.virtualenvs/fundedbyme.com/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute 
    output = self.handle(*args, **options) 
    File "/Library/Python/2.7/site-packages/south/management/commands/migrate.py", line 105, in handle 
    ignore_ghosts = ignore_ghosts, 
    File "/Library/Python/2.7/site-packages/south/migration/__init__.py", line 191, in migrate_app 
    success = migrator.migrate_many(target, workplan, database) 
    File "/Library/Python/2.7/site-packages/south/migration/migrators.py", line 221, in migrate_many 
    result = migrator.__class__.migrate_many(migrator, target, migrations, database) 
    File "/Library/Python/2.7/site-packages/south/migration/migrators.py", line 292, in migrate_many 
    result = self.migrate(migration, database) 
    File "/Library/Python/2.7/site-packages/south/migration/migrators.py", line 125, in migrate 
    result = self.run(migration) 
    File "/Library/Python/2.7/site-packages/south/migration/migrators.py", line 99, in run 
    return self.run_migration(migration) 
    File "/Library/Python/2.7/site-packages/south/migration/migrators.py", line 81, in run_migration 
    migration_function() 
    File "/Library/Python/2.7/site-packages/south/migration/migrators.py", line 57, in <lambda> 
    return (lambda: direction(orm)) 
    File "/Users/ApPeL/Sites/Django/fundedbyme/project/migrations/0056_auto__chg_field_project_project_length.py", line 12, in forwards 
    db.alter_column('project_project', 'project_length', self.gf('django.db.models.fields.IntegerField')()) 
    File "/Library/Python/2.7/site-packages/south/db/generic.py", line 382, in alter_column 
    flatten(values), 
    File "/Library/Python/2.7/site-packages/south/db/generic.py", line 150, in execute 
    cursor.execute(sql, params) 
    File "/Users/ApPeL/.virtualenvs/fundedbyme.com/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: column "project_length" cannot be cast to type integer 

我想知道是否有一些解决方法呢?

您当前迁移这样工作:

  1. 阿尔特列 “project_length” 为另一种类型。

由于您正在进行PostgreSQL不支持的修改,所以已损坏。

您必须修复您的迁移。你可以把它改成下面的迁移(它会工作,但也许可以做更容易):

  1. 创建类型要project_length有另一列project_length_tmp和一些缺省值。
  2. 将数据从列project_length迁移到project_lenght_tmp(请参阅南文档中的数据迁移)。
  3. 删除column project_length。
  4. 将column project_length_tmp重命名为project_length。

种类复杂的迁移,但它有两个主要优势: 1.它将在所有数据库上工作。 2.它与您的旧迁移兼容,因此您可以覆盖旧的迁移(更改文件),它会很好。

方法2

您的问题,另一种方法是只删除所有迁移,并从头开始。如果您只有一个项目的部署,它对您而言将会很好。

您不提供正在执行的SQL的任何细节,但它似乎不太可能是ALTER TYPE失败 - 假设SQL是正确的。

=> CREATE TABLE t (c_text text, c_date date, c_datearray date[]); 
CREATE TABLE 
=> INSERT INTO t VALUES ('abc','2011-01-02',ARRAY['2011-01-02'::date,'2011-02-03'::date]); 
INSERT 0 1 
=> ALTER TABLE t ALTER COLUMN c_text TYPE integer USING (length(c_text)); 
ALTER TABLE 
=> ALTER TABLE t ALTER COLUMN c_date TYPE integer USING (c_date - '2001-01-01'); 
ALTER TABLE 
=> ALTER TABLE t ALTER COLUMN c_datearray TYPE integer USING (array_upper(c_datearray, 1)); 
ALTER TABLE 
=> SELECT * FROM t; 
c_text | c_date | c_datearray 
--------+--------+------------- 
     3 | 3653 |   2 
(1 row) 

没有什么不能做的。我猜这是从你使用的这个Django模块生成的不正确的SQL。