1

根据 Python DB-API 在 RAW SQL 查询中实现命名参数后,我遇到了一个问题。

早些时候,我的代码如下(这在我的开发服务器和客户端的测试服务器上都可以正常工作)

cursor.execute("SELECT DISTINCT(TAG_STATUS) FROM TAG_HIST WHERE TAG_NBR = '%s' " %(TAG_NBR))

我将其更改为以下

cursor.execute("SELECT DISTINCT(TAG_STATUS) FROM TAG_HIST WHERE TAG_NBR = :TAG_NBR " ,{'TAG_NBR':TAG_NBR})

这个更改的版本(带有命名参数)在我的开发服务器上运行良好

  • Windows XP 甲骨文 XE
  • SQL*Plus:版本 11.2.0.2.0
  • cx_Oracle-5.1.2-11g.win32-py2.7

但是,当部署在我的客户端的测试服务器上时,它不会....所有查询的执行都失败。

我的客户服务器的特点如下

  • 视窗服务器 2003
  • Oracle 数据库 10g 企业版 10.2.0.1.0 - 64bi
  • cx_Oracle-5.1.2-10g.win32-py2.7

我得到的错误如下

Traceback (most recent call last):
  File "C:/Program Files/App_Logic/..\apps\views.py", line 400, in regularize_TAG
    T_cursor.execute("SELECT DISTINCT(TAG_STATUS) FROM TAG_HIST WHERE TAG_NBR = :TAG_NBR " ,{'TAG_NBR':TAG_NBR})
DatabaseError: ORA-01460: unimplemented or unreasonable conversion requested

感谢有人可以帮助我解决这个问题。

仅当 cx_Oracle 代码在 Web 应用程序(托管在 Apache 上)中运行时才会出现此问题。

如果我在 python 命令行中使用命名参数运行相同的代码,那么查询运行得很好。

4

1 回答 1

3

这是如何解决的。

我尝试将 unicode 类型转换为 str,结果是肯定的。

例如,这个工作

T_cursor.execute("SELECT DISTINCT(TAG_STATUS) FROM TAG_HIST WHERE TAG_NBR = :TAG_NBR", {'TAG_NBR': str(TAG_NBR)})

因此,实际上,unicode 被编码为潜在的非 unicode 数据库字符集而受到破坏。

为了解决这个问题,这是另一种选择

import os
os.environ.update([('NLS_LANG', '.UTF8'),('ORA_NCHAR_LITERAL_REPLACE', 'TRUE'),])
import cx_Oracle

以上保证我们确实处于 UTF8 模式。

第二个环境变量不是绝对必要的。而且 AFAIK 没有其他方法可以设置这些变量(除了在运行应用程序本身之前),因为 NLS_LANG 是由 OCI 库从环境中读取的。

于 2013-04-17T03:57:06.350 回答