usar type que escape acentos python oracle unicode cx-oracle

type - unicode python 3



No se puede insertar Unicode usando cx-Oracle (1)

Tengo un problema al insertar unicode en un esquema de Oracle, creo que la base de datos es una instancia de Oracle 11g pero no estoy seguro en este momento. Estoy usando python 2.6.1 en OS X 10.6.8 (esta es la versión del sistema de python) y estoy usando el módulo de controlador cx-Oracle versión 5.1 descargado de sourceforge.net, creado e instalado en una instancia virtualenv 1.6.1 con los paquetes del sitio visibles. Mi guión es el siguiente

import cx_Oracle connection = cx_Oracle.connect( "<name>/<password>@<host>/<service-name>" ) cursor = connection.cursor() result = cursor.execute(u"create table UNICODE_TEST (id NUMBER(6), text NCLOB not NULL)") raw_text = open("test.txt",''r'').read() if isinstance(raw_text,str): raw_text = raw_text.decode("utf_8") statement = u"insert into UNICODE_TEST (id, text) values (1,''%s'')" % raw_text result = cursor.execute(statement)

Yo creo una conexión, creo el cursor, ejecuto una declaración para crear una tabla de prueba con una identificación y un campo de texto de los tipos NUMBER y NCLOB. Abro un archivo que contiene lo que sé que es texto codificado en UTF-8, decodificando la cadena a Unicode. Cree una declaración de inserción en una cadena Unicode y ejecute esa declaración, y el resultado es este error.

Traceback (most recent call last): File "unicode-test.py", line 19, in <module> result = cursor.execute(statement) UnicodeEncodeError: ''ascii'' codec can''t encode character u''/u2122'' in position 170: ordinal not in range(128)

Algo está intentando codificar mi declaración como ASCII antes de insertarla en el esquema de Oracle. Así que comencé a buscar para entender mejor cómo cx-Oracle maneja Unicode y encontré esto en HISTORY.txt de la fuente de cx-Oracle que descargué de sourceforge.net

Cambios de 5.0.4 a 5.1
1) Elimine la compatibilidad con el modo UNICODE y permita que se pase Unicode en cualquier lugar donde se pase una cadena. Esto significa que las cadenas se pasarán a Oracle utilizando el valor de la variable de entorno NLS_LANG en Python 3.x también. Al hacer esto, se eliminaron muchos problemas que se descubrieron al usar el modo UNICODE y también se eliminó una restricción innecesaria en Python 2.x que Unicode no podía usarse en cadenas de conexión o sentencias de SQL, por ejemplo. ...

Supongo que la variable de entorno NLS_LANG está configurada en ''ascii'' o algún equivalente, así que intento configurar NLS_LANG en ''AL32UTF8'', que creo que es el valor correcto para unicode, y establezco el nuevo valor antes de crear mi conexión.

os.environ["NLS_LANG"] = "AL32UTF8" connection = cx_Oracle.connect( "<user>/<password>@<host>/<service-name>" ) cursor = connection.cursor() ...

Pero me sale este error.

Traceback (most recent call last): File "unicode-test.py", line 11, in <module> "<user>/<password>@<host>/<service-name>" cx_Oracle.DatabaseError: ORA-12705: Cannot access NLS data files or invalid environment specified

Así que parece que no puedo manipular el valor NLS_LANG.

Aquí están mis preguntas a partir de ahora. ¿Me estoy perdiendo algo simple como un tipo de columna incorrecto? ¿El problema con el controlador cx-Oracle? ¿Debo establecer la variable de entorno "WITH_UNICODE" al compilar el módulo cx-Oracle y cómo lo haría? ¿Es el problema con la instancia de Oracle? Tengo poca experiencia con Oracle y nunca he trabajado con Oracle y python juntos. He pasado dos días trabajando en este problema y me gustaría tener una mejor comprensión de cuál es el problema antes de ir al grupo de DBA.

Gracias,


Establecer la variable de entorno es la forma correcta, pero "AL32UTF8" no es el valor correcto para NLS_LANG. Para obtener el valor correcto del NLS_LANG utilizado en su instancia de Oracle, ejecute

SELECT USERENV (''language'') FROM DUAL