【发布时间】:2021-08-26 14:19:08
【问题描述】:
我有一个 Oracle 数据库的以下模型,它不是我的 Django 项目的一部分:
class ResultsData(models.Model):
RESULT_DATA_ID = models.IntegerField(primary_key=True, db_column="RESULT_DATA_ID")
RESULT_XML = models.TextField(blank=True, null=True, db_column="RESULT_XML")
class Meta:
managed = False
db_table = '"schema_name"."results_data"'
数据库本身的RESULT_XML 字段被声明为XMLField。由于没有字符限制,我选择在 Django 模型中将其表示为 TextField。 当我尝试使用该模型下载一些数据时,我收到以下错误:
DatabaseError: ORA-19011: Character string buffer too small
我想,这是因为 RESULT_XML 字段中存储的数据量很大,因为当我尝试使用 .values("RESULT_DATA_ID") 提取记录时,它可以正常提取。
关于如何解决此问题的任何想法?到目前为止,谷歌搜索没有任何结果。
【问题讨论】:
-
遗憾的是,XML 团队从未通过 Oracle C 堆栈提供良好的客户端支持(幸运的是 JSON 支持要好得多!)通常存在长度问题。你能像
SELECT XMLTYPE.GETCLOBVAL(mycol) FROM mytab这样在表上创建一个视图并进行查询吗?这是一个“标准”解决方案:cx-oracle.readthedocs.io/en/latest/user_guide/…。您可能还需要告诉 cx_Oracle 以字符串形式获取 LOB,请参阅github.com/oracle/python-cx_Oracle/blob/main/samples/…中的输出类型处理程序@ -
是的,根据您的回复,我实际上已经制定了一个解决方案,它给了我想要的东西,但是使用原始 SQL 查询,这不能满足使用 Django ORM 的一致性尽可能。我会尽快发布我自己问题的答案。