为什么我从 SQL Lite 到 Posgres DB 获取此错误迁移数据?重复键值违反唯一约束

问题描述

我是 Django 和 Python 的新手,我正在尝试学习这个关于如何将 Django 应用程序从 sqlLite 迁移到 Postgres 数据库的视频教程:

https://www.youtube.com/watch?v=ZgRkGfoy2nE&t=554s

但是我发现了一些问题。按照我所做的详细信息:

我在 Ubuntu 20.04 上工作,我有一个由其他人制作的 Django 应用程序,它使用 sqlLite 并且必须在 Postgres 上迁移。按照上一个教程,我完成了以下步骤:

  1. 首先,我在我的 Ubuntu 系统上安装了 Postegres 和 PgAdmin4。然后在这里我创建了一个名为 dgsrgdb 的数据库,它必须是我的应用程序的新数据库,以替代 sql Lite DB。

  2. 我安装这个包是为了让 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
                        }
                    }
                }
    
  3. 我用这个命令备份了我原来的 sqlLite 数据库

    pip3 install psycopg2-binary
    

    并且我获得了 datadump.json 文件,该文件应该包含必须移动到新 Postgres 数据库上的原始数据库中的数据。

  4. 进入 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 用户

  5. 现在是我的问题。如教程中所示,我在命令行中执行此命令以在 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 所拥有的:

enter image description here

  1. 然后按照教程,我尝试使用以下命令将之前导出到我的 datadump.json* 文件中的数据导入到这些表中:

    python3 manage.py migrate --run-syncdb
    

但是执行此命令时我收到此错误消息:

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,因为模型的默认 viewchangedelete 权限是在迁移时创建的,尽管我不能说这种行为是否发生在 run-syncdb 期间。您可以先测试 dumpdata,而不排除 auth.Permission

,

我不太确定为什么会出现错误,但是我通过指定转储中所需的所有应用程序名称解决了这个问题

python manage.py dumpdata auth.user auth.group app1 app2 app3 > database.json

它将转储所有需要的数据并且 python manage.py loaddata database.json 命令不会返回任何错误。