迁移时django sqlite到postgresql ProgrammingError
Posted
技术标签:
【中文标题】迁移时django sqlite到postgresql ProgrammingError【英文标题】:django sqlite to postgresql ProgrammingError when migrate 【发布时间】:2016-11-08 21:06:53 【问题描述】:我已经看过很多关于这个的帖子,但到目前为止没有一个对我有帮助。我有一个工作的 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 关系 '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 模型相关的所有代码,然后再次迁移,我仍然遇到同样的错误:(
【问题讨论】:
您想保留来自 sqlite 的数据吗?python manage.py migrate contenttypes
是做什么的?
我不介意从 sqlite 丢失我的数据,并且该命令输出与上述相同的错误:/
您可以编辑问题,而不是在答案中添加新信息。
【参考方案1】:
您可以 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 文件的名称。
【讨论】:
不幸的是,这不再起作用了 :( 当我尝试转储数据时,我收到类似于我提到的错误:CommandError: Unable to serialize database: Error: relation "django_content_type" doesn't exist
你需要保留你的数据吗
好吧,现在我想起来了,不是真的,因为我在加载应用程序时从 Excel 文件中加载了我的数据。
那么您就可以安全地删除您的 sqlite 文件了。删除它后,使用 postgres 数据库迁移应该没有问题。如果我对您有所帮助,您可以通过接受这个作为答案和/或投票来帮助我:)
我会尝试的,但我通过删除所有迁移和 sqlite 文件尝试了类似的操作,但我仍然遇到相同的错误,就像我应该撤消所有应用的迁移一样。我会尝试恢复到我最近的提交并重新开始。我会回复你,但我怎样才能投票或接受评论作为答案? :P【参考方案2】:
好吧,最后我在 *** 上找到了一篇小帖子,上面说 psycopg2 应该在我的 settings.py 中的 INSTALLED_APPS 中。我又跑了一次
python manage.py migrate
而且效果很好!感谢那些回答的人,真的很感激!
虽然现在我在注释掉与“Ecole”模型相关的所有代码之前得到了错误。它与内容类型一非常相似:
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
。【参考方案3】:
所以我将其发布为答案,因为评论太长了:
我在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 并使用注释代码进行迁移,然后取消注释并运行应用程序就像一个魅力!感谢所有回答的人,非常感谢!
【讨论】:
【参考方案4】:我发布此内容是希望它能为某人节省大量时间。我知道这是一个旧帖子,但我昨晚遇到了这个问题。虽然上述一些解决方案适用于某些人,但我发现它们都不适合我。我最终做的是仔细检查我在本地机器上使用的数据库是否与另一个数据库表冲突。
原来另一个所有者数据库的命名约定与我的迁移冲突。即使数据库名称不同,表也共享相同的约定。 Django(2.2) 在解决迁移时遇到了问题。我认为这是因为迁移表位于公共模式中,因此服务器实例中的所有数据库在运行迁移时都可以引用同一个表。这就是我遇到问题的原因。
所以我的解决方案是设置另一个 postgres 实例并停止正在使用的旧 Postgres 实例并配置一个新的数据库。
完成此操作后,无需任何上述解决方案即可应用迁移。两个独立的数据库和项目因为模型名称相似而发生这样的冲突非常奇怪。这就是我认为发生的事情。
【讨论】:
以上是关于迁移时django sqlite到postgresql ProgrammingError的主要内容,如果未能解决你的问题,请参考以下文章
Django 1.8 迁移、自定义用户模型和 Postgres/MySQL 的奇怪问题
迁移时django sqlite到postgresql ProgrammingError