【问题标题】:Django shell ORA-00904Django 外壳 ORA-00904
【发布时间】:2017-06-20 03:42:42
【问题描述】:

我有一个来自 oracle 的旧数据库,其中包含字段。如果我运行 Orders.objects.count() 我得到正确的金额。当我运行 Orders.object.all() 时出现此错误,但尚未在线找到解决方案。

class Orders(models.Model):
account_obj_db = models.BigIntegerField(blank=True, null=True)
account_obj_id0 = models.BigIntegerField(blank=True, null=True)
account_obj_type = models.CharField(max_length=1020, blank=True, null=True)
account_obj_rev = models.BigIntegerField(blank=True, null=True)
order_payload_buf_size = models.BigIntegerField(blank=True, null=True)
total_entitlement_count = models.BigIntegerField(blank=True, null=True)
currency_code = models.BigIntegerField(blank=True, null=True)

>>> from home.models import Orders
>>> Orders.objects.all()
回溯(最近一次通话最后一次):
文件“/home/user/dev2/lib/python3.5/site-packages/django/db/backends/utils.py”,第 64 行,在执行
返回 self.cursor.execute(sql, params)
文件“/home/user/dev2/lib/python3.5/site-packages/django/db/backends/oracle/base.py”,第 481 行,在执行
返回 self.cursor.execute(查询,self._param_generator(params))
cx_Oracle.DatabaseError: ORA-00904: "ORDERS"."ID": 标识符无效

【问题讨论】:

  • 请添加一些示例行
  • 听起来模型和数据库表不匹配,您可以迁移以确保它们匹配或像数据库中的表一样编辑模型
  • 由于我的表没有主键,我相信 Django 正在创建 ID 字段。在文档中,我没有看到绕过自动字段的方法。任何想法? @Mojimi
  • @AlleeClark 我对旧数据库也有类似的问题,所以是的,您需要一个主键,在数据库中表的一个字段上创建该约束,然后添加 primary_key = true 参数到模型中的同一字段,您可能需要再次迁移
  • @Mojimi 你是对的。我必须添加主键。我不确定您是否想添加一个答案供我选择。它将帮助那些努力从遗留数据库中序列化数据的人。

标签: sql django oracle django-models


【解决方案1】:

这里的问题是,当您不为模型分配主键时,Django 将创建一个未在模型上显示的“ID”PK 字段。

但是当您在模型的元数据中设置managed = false(我假设您这样做了)时,Django 不会在数据库中创建/管理此表,这意味着它不会创建底层 ID pk 字段,但模型级别仍然认为它存在(您可以认为这是一个错误并报告它)并尝试使用它进行查询,因此出现 ORA 错误

解决方案是在模型中手动设置与数据库中相同的 PK 字段,假设 account_obj_db 是旧数据库中 Orders 的 PK 字段,只需在模型中添加 primary_key 即可。 py:

class Orders(models.Model):
    account_obj_db = models.BigIntegerField(primary_key = true, blank=True, null=True)
    account_obj_id0 = models.BigIntegerField(blank=True, null=True)
    account_obj_type = models.CharField(max_length=1020, blank=True, null=True)
    account_obj_rev = models.BigIntegerField(blank=True, null=True)
    order_payload_buf_size = models.BigIntegerField(blank=True, null=True)
    total_entitlement_count = models.BigIntegerField(blank=True, null=True)
    currency_code = models.BigIntegerField(blank=True, null=True) 

在此之后您可能需要进行另一次迁移

还要注意缩进

【讨论】:

    猜你喜欢
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2018-07-24
    • 2015-04-30
    相关资源
    最近更新 更多