问题描述
我是 Django 和 Python 的新手,我正在尝试学习这个关于如何将 Django 应用程序从 sqlLite 迁移到 Postgres 数据库的视频教程:
https://www.youtube.com/watch?v=ZgRkGfoy2nE&t=554s
但是我发现了一些问题。按照我所做的详细信息:
我在 Ubuntu 20.04 上工作,我有一个由其他人制作的 Django 应用程序,它使用 sqlLite 并且必须在 Postgres 上迁移。按照上一个教程,我完成了以下步骤:
-
首先,我在我的 Ubuntu 系统上安装了 Postegres 和 PgAdmin4。然后在这里我创建了一个名为 dgsrgdb 的数据库,它必须是我的应用程序的新数据库,以替代 sql Lite DB。
-
我安装这个包是为了让 Python\Django 与 Postgres 一起运行:
function searchTable() { // Declare variables var input,filter,ul,li,a,i,txtValue,r; input = document.getElementById('imtListInput'); filter = input.value.toupperCase(); ul = document.getElementById("imtList"); li = ul.getElementsByTagName('li'); r = document.querySelectorAll('input[type="radio"]'); r.forEach(elem => { elem.checked = false }); // Loop through all list items,and hide those who don't match the search query for (i = 0; i < li.length; i++) { a = li[i].getElementsByTagName("a")[0]; txtValue = a.textContent || a.innerText; if (txtValue.toupperCase().indexOf(filter) > -1) { li[i].style.display = ""; } else { li[i].style.display = "none"; } if (input.value === '') { r[0].checked = true } } }
-
pip3 install psycopg2-binary
并且我获得了 datadump.json 文件,该文件应该包含必须移动到新 Postgres 数据库上的原始数据库中的数据。
-
进入 Django settings.py 文件我替换了这个配置:
python3 manage.py dumpdata > datadump.json
此配置与 Postgres 相关:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR,'db.sqlite3'),} }
所以现在我的应用程序指向我之前在 Postgres 上创建的新 dgsrgdb。我目前使用的是“root”postgres 用户。
-
现在是我的问题。如教程中所示,我在命令行中执行此命令以在 dgsrg Postgres DB 上创建我的表:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2','NAME': 'dgsrg','USER': 'dgsrguser','PASSWORD': 'password','HOST': '127.0.0.1','PORT': '5432',} }
与我的 Django 应用程序相关的表似乎是在我的新数据库上创建的,这是我使用 PgAdmin 所拥有的:
但是执行此命令时我收到此错误消息:
python manage.py loaddata datadump.json
为什么?可能是什么问题呢?我错过了什么?我该如何尝试修复它?
解决方法
在使用 loaddata
命令加载数据之前,
我们必须刷新所有表,因为 django 本身在迁移过程中会创建一些对象。
尝试运行下面的命令,命令将刷新所有表的数据:
python manage.py sqlflush | python manage.py dbshell
然后,loaddata
进入 PostgreSQl。
问题在于,通过从 sqlite 转储所有数据,您还复制了内容类型。请记住,内容类型框架包含有关模型的元数据。当您尝试将 admin.LogEntry
加载到 contenttypes 表时,而它已经拥有来自 migrate
的数据时,您的回溯错误指出了这种可能性。
您应该做的是在您的 contenttypes
中排除 dumpdata
。
python manage.py dumpdata --exclude=contenttypes
您也有可能必须排除 auth.Permission
,因为模型的默认 view
、change
和 delete
权限是在迁移时创建的,尽管我不能说这种行为是否发生在 run-syncdb
期间。您可以先测试 dumpdata
,而不排除 auth.Permission
。
我不太确定为什么会出现错误,但是我通过指定转储中所需的所有应用程序名称解决了这个问题
python manage.py dumpdata auth.user auth.group app1 app2 app3 > database.json
它将转储所有需要的数据并且 python manage.py loaddata database.json
命令不会返回任何错误。