繁体   English   中英

带有oracle CLOB 字段的Django loaddata 错误

[英]Django loaddata error with oracle CLOB fields

我有一个带有 oracle 后端的 django 项目,我试图将现有数据迁移到新服务器。 我通常使用 Postgresql 并且对 oracle 怪癖的了解有限。

运行 django 2.2 和 python 3.8

我已经使用python manage.py dumpdata > allmydata.json毫无问题地导出了数据。

当我使用python manage.py loaddata allmydata.json加载数据时,出现以下错误。

ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column

在我遇到此错误之前,大约有一半的数据加载。 我的理解是我所有的 LOB 列都应该是 sql 查询的结尾。

我的问题是如何在加载数据和正常操作中实现这一点? 有没有办法强制 Django ORM 以特定方式构造查询? 如果我更改模型中字段定义的顺序,会这样做吗? 我加载的数据库是干净的,所以如果需要我可以删除所有内容。

澄清一下,我可以从站点和 loaddata 触发相同的问题。 问题似乎是生成的 SQL 无法解释 LOB CLOB 类型的列,并且 NCLOB 需要位于插入语句的末尾。

那么如何控制字段在 ORM 生成的插入语句中出现的顺序。

经过大量的挖掘和实验,我确定了以下内容:

给定一个模型,如:

class Experiment(models.Model):
    experiment_id = models.CharField(max_length=150, unique=True)
    name = models.CharField(max_length=100, blank=True, null=True)
    source_application = models.CharField(max_length=100, blank=True, null=True)
    par_id = models.CharField(max_length=50, blank=True, null=True)
    experiment_information = RichTextUploadingField(blank=True)
    conclusion = RichTextUploadingField(blank=True)
    experiment_creator = models.CharField(blank=True, null=True, max_length=100)
    experiment_target = RichTextField(blank=True)
    project_lead = models.CharField(max_length=100, blank=True, null=True)
    experiment_path = models.CharField(max_length=200, blank=True, null=True)
    project = models.CharField(max_length=200, blank=True, null=True)
    start_date = models.DateField(blank=True, null=True)
    end_date = models.DateField(blank=True, null=True)
    alt_eln_id = models.CharField(max_length=20, blank=True, null=True)
    need_witness = models.BooleanField(blank=True, null=True)

将生成一个插入查询,如:

('INSERT INTO "MPD_EXPERIMENT" ("EXPERIMENT_ID", "NAME", "SOURCE_APPLICATION", '
 '"PAR_ID", "EXPERIMENT_INFORMATION", "CONCLUSION", "EXPERIMENT_CREATOR", '
 '"EXPERIMENT_TARGET", "PROJECT_LEAD", "EXPERIMENT_PATH", "PROJECT", '
 '"START_DATE", "END_DATE", "ALT_ELN_ID", "NEED_WITNESS") VALUES (%s, %s, %s, '
 '%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING '
 '"MPD_EXPERIMENT"."ID" INTO %s')

因此,要解决ORA-24816问题,我只需要更改模型中字段定义的顺序。 在这种情况下,我需要将所有 RichTextUploadingFields 移动到模型声明的末尾。

  class Experiment(models.Model):
        experiment_id = models.CharField(max_length=150, unique=True)
        name = models.CharField(max_length=100, blank=True, null=True)
        source_application = models.CharField(max_length=100, blank=True, null=True)
        par_id = models.CharField(max_length=50, blank=True, null=True)
        experiment_creator = models.CharField(blank=True, null=True, max_length=100)
        project_lead = models.CharField(max_length=100, blank=True, null=True)
        experiment_path = models.CharField(max_length=200, blank=True, null=True)
        project = models.CharField(max_length=200, blank=True, null=True)
        start_date = models.DateField(blank=True, null=True)
        end_date = models.DateField(blank=True, null=True)
        alt_eln_id = models.CharField(max_length=20, blank=True, null=True)
        need_witness = models.BooleanField(blank=True, null=True)
        experiment_information = RichTextUploadingField(blank=True)
        conclusion = RichTextUploadingField(blank=True)
        experiment_target = RichTextField(blank=True)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM