Sql Django壳牌ORA-00904
我有一个oracle遗留数据库,其中包含字段。如果我运行Orders.objects.count(),我会得到正确的数量。当我运行Orders.object.all()时,我得到了这个错误,但还没有在线找到解决方案Sql Django壳牌ORA-00904,sql,django,oracle,django-models,Sql,Django,Oracle,Django Models,我有一个oracle遗留数据库,其中包含字段。如果我运行Orders.objects.count(),我会得到正确的数量。当我运行Orders.object.all()时,我得到了这个错误,但还没有在线找到解决方案 类订单(models.Model): account\u obj\u db=models.BigIntegerField(blank=True,null=True) account\u obj\u id0=models.BigIntegerField(blank=True,null=
类订单(models.Model):
account\u obj\u db=models.BigIntegerField(blank=True,null=True)
account\u obj\u id0=models.BigIntegerField(blank=True,null=True)
account\u obj\u type=models.CharField(max\u length=1020,blank=True,null=True)
account\u obj\u rev=models.bigingerfield(blank=True,null=True)
order\u payload\u buf\u size=models.BigIntegerField(blank=True,null=True)
total\u authority\u count=models.BigIntegerField(blank=True,null=True)
currency\u code=models.BigIntegerField(blank=True,null=True)
>>从主页。型号导入订单
>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\u生成器(params))
cx_Oracle.DatabaseError:ORA-00904:“订单”。“ID”:无效标识符这里的问题是,当您没有为您的模型分配主键时,Django将创建一个未在模型上显示的“ID”PK字段
但是,当您在模型的Meta中设置<代码>托管=false <代码>(我假设您这样做)时,Django将不会在数据库中创建/管理该表,这意味着它不会创建基础ID-PK字段,但模型级别仍然认为它存在(可以考虑这一错误并报告它),并尝试用它进行查询,因此ORA错误
解决方案是在您的模型中手动设置与数据库中相同的PK字段,比如说,account\u obj\u db
是传统数据库中订单的PK字段,只需在模型中添加主键即可。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)
在此之后,您可能需要进行另一次迁移
还要注意缩进请添加一些示例行,例如模型和数据库表不匹配,您可以迁移以确保它们匹配,也可以编辑模型,例如数据库中的表,因为我的表没有主键。我相信Django正在创建ID字段。在文档中,我看不到绕过自动字段的方法。有什么想法吗@Mojimi@AlleeClark我对遗留数据库也有类似的问题,因此,如果需要主键,在数据库中表的一个字段上创建该约束,并将primary_key=true参数添加到模型中的同一字段,则可能需要迁移again@Mojimi你是对的。我必须添加主键。我不确定您是否想添加答案供我选择。它将帮助那些努力从遗留数据库序列化数据的人。