迁移

时间:2016-07-06 17:40:47

标签: python django postgresql sqlite database-migration

我已经看过很多关于此的帖子,但到目前为止没有人帮助过我。我有一个工作的django应用程序,我想从sqlite转到postgresql数据库。为此,我正在关注djangogirls教程,这个教程很棒,直到出现一些错误。

我已经在我的电脑上下载了postgresql进行开发,然后我下载并安装了psycopg2,工作正常,我更改了我的settings.py数据库配置,我正处于我想要迁移到postgres的地步。

他们在教程中所说的只是运行“python manage.py migrate”,这对我来说不起作用,可能是因为他们认为它是一个空白的应用程序或其他东西,而且我已经有了与之关联的迁移和模型。

我看到正在运行

python manage.py makemigrations
python manage.py migrate

可以解决问题,但我的自定义模型出了问题。然后我读到我可以注释掉使用这个有问题的模型的所有代码,然后运行

python manage.py makemigrations  
python manage.py migrate --fake 

取消注释,然后运行

python manage.py migrate

我试过了,但现在我收到了与我的自定义模型相同的错误,但是对于contenttypes应用程序。

追溯是这样的:
(“la relation'django_content_type'n'existe pas”=“关系'django_content_type'不存在”)

Operations to perform:
  Apply all migrations: auth, contenttypes, sessions, admin
Running migrations:
  No migrations to apply.
Traceback (most recent call last):
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: ERREUR:  la relation « django_content_type » n'existe pas
LINE 1: ..."."app_label", "django_content_type"."model" FROM "django_co...
                                                             ^

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\contrib\contenttypes\models.py", line 67, in get_for_model
    ct = self.get(app_label=opts.app_label, model=opts.model_name)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\db\models\manager.py", line 122, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\db\models\query.py", line 381, in get
    num = len(clone)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\db\models\query.py", line 240, in __len__
    self._fetch_all()
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\db\models\query.py", line 1074, in _fetch_all
    self._result_cache = list(self.iterator())
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\db\models\query.py", line 52, in __iter__
    results = compiler.execute_sql()
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\db\models\sql\compiler.py", line 848, in execute_sql
    cursor.execute(sql, params)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\db\backends\utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\db\utils.py", line 95, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\utils\six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: ERREUR:  la relation « django_content_type » n'existe pas
LINE 1: ..."."app_label", "django_content_type"."model" FROM "django_co...
                                                             ^


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\core\management\__init__.py", line 353, in execute_from_command_line
    utility.execute()
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\core\management\__init__.py", line 345, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\core\management\base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\core\management\base.py", line 399, in execute
    output = self.handle(*args, **options)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\core\management\commands\migrate.py", line 204, in handle
    emit_post_migrate_signal(self.verbosity, self.interactive, connection.alias)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\core\management\sql.py", line 50, in emit_post_migrate_signal
    using=db)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\dispatch\dispatcher.py", line 192, in send
    response = receiver(signal=self, sender=sender, **named)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\contrib\auth\management\__init__.py", line 85, in create_permissions
    ctype = ContentType.objects.db_manager(using).get_for_model(klass)
  File "C:\Users\gbastien1\Envs\django-carte\lib\site-packages\django\contrib\contenttypes\models.py", line 80, in get_for_model
    "Error creating new content types. Please make sure contenttypes "
RuntimeError: Error creating new content types. Please make sure contenttypes is migrated before trying to migrate apps individually.

我的迁移看起来像这样:

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

我不知道如何解决这个问题,因为我尝试了很多东西。数据库和部署不是我的优势。有人可以帮我解决这个问题吗?

修改 我尝试将我的所有更改恢复到我的应用程序工作的部分,并通过删除我的sqlite文件和我的所有迁移重新开始,我删除了所有的pyc(python缓存)文件,注释掉了所有与Ecole模型相关的代码,然后再次迁移,我仍然得到同样的错误:(

3 个答案:

答案 0 :(得分:0)

您可以dump your data into json删除sqlite文件,然后使用postgres set up as a DB迁移项目。

示例工作流程可能如下所示:

mkdir <app name>/fixtures

python manage.py dumpdata >> <app name>/fixtures/all_data.json

rm <sqlite file>.db

python manage.py migrate

python manage.py loaddata <app name>/fixtures/all_data.json

其中<app name>是主应用程序的名称(或任何目录),<sqlite file>是sqlite文件的名称。

答案 1 :(得分:0)

好吧,最后我发现stackoverflow上的一个小帖子说psycopg2应该在我的settings.py中的INSTALLED_APPS中。我又添了一个跑了

python manage.py migrate

它工作正常!感谢那些回答的人,非常感谢!

虽然现在我得到了错误,但在评论出所有与&#34; Ecole&#34;相关的代码之前。模型。它与内容类型非常相似:

programmingError: ERROR: relation "carte_interactive_ecole" does not exist

在哪里&#34; carte_interactive&#34;是我的应用名称,&#34; Ecole&#34;我的模特。

有人对我有另一个想法吗?当有引用它的代码时,为什么我不能迁移我的模型?如果我注释掉所有的Ecole代码,那很好......

修改
我发现如果我在apps.py ready()中注释掉代码,我可以迁移我的应用程序,但它可能不会完全迁移,因为当我运行我的应用程序并且我做了一些使用数据库的东西时,我得到的错误与以上。 :/

答案 2 :(得分:0)

所以我发布这个作为答案,因为评论太长了:

我在apps.py中注释掉了使用我的模型的代码(它可能在迁移之前使用它,所以模型还不存在。然后我运行了makemigrations,我得到了:

Migrations for 'carte_interactive':  
    001_initial.py:  
        -Create model Ecole  
        -Create model ExcelFile 

这是我的两个型号,看起来很好。

然后我运行了迁移,并获得了

apply all migrations: admin, carte_interactive, [...]  
Running Migrations: No migrations to apply. 

当我显示所有情况时,所有内容都会被检查,所以一切都已完成似乎,虽然我昨天尝试了--fake所以可能是它检查了它们但没有创建一些表...

编辑(解决方案)
好的,所以整个问题首先是psycopg2没有包含在settings.py的INSTALLED_APPS中,因此无法在postgresql或其他东西中创建表。

而且,我通过完全删除数据库并重新创建它来开始迁移(比如删除所有表但更容易)。然后,另一个问题是apps.py中的代码在迁移之前运行,因此我必须在运行迁移之前对其进行评论。毕竟,运行makemigrations并使用注释代码进行迁移,然后取消注释并运行应用程序就像一个魅力!感谢所有回答的人,非常感谢!