Django shell ORA-00904

时间:2017-02-02 21:47:59

标签: sql django oracle django-models

我有一个来自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行,执行中
    return self.cursor.execute(sql,params)
  文件“/home/user/dev2/lib/python3.5/site- packages / django / db / backends / oracle / base.py”,第481行,执行中
    return self.cursor.execute(query,self._param_generator(params))
cx_Oracle.DatabaseError:ORA-00904:“ORDERS”。“ID”:标识符无效

1 个答案:

答案 0 :(得分:1)

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

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

解决方案是在您的模型中手动设置与数据库中相同的PK字段,让我们说account_obj_db是旧数据库中Orders的PK字段,只是在models.py中添加primary_key:

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) 

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

还要注意缩进