django sqlite to postgresql 数据库迁移时出现 ProgrammingError 错误。
django sqlite to postgresql 数据库迁移时出现 ProgrammingError 错误。
我看到了很多关于这个问题的帖子,但都没有帮到我。我有一个工作正常的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" = "the relation 'django_content_type' does not exist")
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... ^ 上面的异常是以下异常的直接原因: 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... ^ 在处理以上异常时,发生了另一个异常: Traceback (most recent call last): File "manage.py", line 10, inexecute_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
我不知道如何解决这个问题,因为我尝试了很多方法。数据库和部署并不是我的强项。有人可以帮我解决这个问题吗?
最终,我在stackoverflow上找到了一个小的帖子,说settings.py中应该把psycopg2添加到INSTALLED_APPS。我添加了它,然后再次运行python manage.py migrate
,一切正常!非常感谢那些回答的人,真的很感激!
不过现在我又遇到了之前注释掉与"Ecole"模型相关的所有代码后出现的错误。这个错误与contentypes的错误非常相似:
programmingError: ERROR: relation "carte_interactive_ecole" does not exist
其中"carte_interactive"是我的应用程序名称,"Ecole"是我的模型名称。
有没有人对我有其他的想法?为什么在有引用它的代码时我不能迁移我的模型?如果我注释掉所有的Ecole代码,就没问题...
编辑
我发现如果我在apps.py的ready()方法中注释掉代码,我可以迁移我的应用程序,但可能迁移不完全,因为当我运行我的应用程序并执行使用数据库的操作时,会得到与上面相同的错误。
尝试删除migrations
文件夹中除了__init__.py
文件之外的所有内容。然后再次运行python manage.py makemigrations
,然后运行python manage.py migrate
。
问题原因:在apps.py中的代码在迁移之前就使用了模型,导致模型还不存在。在运行makemigrations时,成功创建了两个模型Ecole和ExcelFile的迁移文件。但是,在运行migrate时,却提示没有要应用的迁移。
解决方法:首先,在settings.py的INSTALLED_APPS中添加psycopg2。然后,删除数据库并重新创建。接下来,在运行迁移之前,将apps.py中的代码注释掉。最后,运行makemigrations和migrate,并取消注释并运行应用程序。
编辑(解决方案):问题的根本原因是在settings.py中的INSTALLED_APPS中没有包含psycopg2,导致无法在postgresql中创建表。另外,通过完全删除数据库并重新创建,重新开始迁移的过程。在运行迁移之前,需要将apps.py中的代码注释掉。经过以上步骤后,运行makemigrations和migrate,并取消注释并运行应用程序,问题得到解决。感谢所有回答的人,非常感谢!
问题出现的原因是在将Django项目从SQLite迁移到PostgreSQL时,执行migrate命令时出现ProgrammingError错误。解决方法是将数据转储为json格式,删除SQLite文件,然后使用PostgreSQL作为数据库进行迁移。具体步骤如下:
1. 创建一个名为
2. 执行命令python manage.py dumpdata >>
,将数据转储为json文件。
3. 删除SQLite文件,命令为rm
,其中
4. 执行命令python manage.py migrate
,将项目迁移到PostgreSQL数据库。
5. 执行命令python manage.py loaddata
,将之前转储的数据加载到PostgreSQL数据库中。
如果你不需要保留数据,可以直接删除SQLite文件。删除后,使用PostgreSQL数据库进行迁移应该不会出现问题。如果我对你有所帮助,你可以帮我一个忙,接受这个答案并/或点赞 🙂
如果尝试了上述方法仍然出现相同的错误,可以尝试撤销所有已应用的迁移,回滚到最新的提交,然后重新开始。关于如何点赞或接受评论作为答案,可以查看相应的网站操作指南。