Python cx_Oracle e unicode
outubro 31st, 2008Fazendo alguns scripts de migração com SQLAlchemy tive problemas com os resultados das queries.
Acontece que todos os resultados que possuem caracteres especiais vinham com "?".
Por exemplo, se nos resultados tivesse o nome João, vinha "Jo?o".
A princípio acreditei ser algo relacionado à configuração do SQLAlchemy, mas depois descobri que o problema está relacionado ao ambiente do oracle.
Para resolver o problema, basta definir a variável que ambiente que será usada pelas bibliotecas compartilhadas do Oracle:
NLS_LANG
Exemplo:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from sqlalchemy import *
from sqlalchemy.sql import *
os.environ["NLS_LANG"] = ".UTF8"
engine = create_engine(’oracle://usuario:senha@tnsentry’,
encoding=’utf8′,
convert_unicode=True)
metadata = MetaData(bind=engine)
connection = engine.connect()
user = Table(’table_user’, db.metadata,
Column(’user_id’, Integer, nullable=False),
Column(’user_name’, Unicode(200)))
query = select([user.c.user_name]).\
where((user.c.user_name.like(’%Pereira%’))). \
order_by(user.c.user_name.desc()).limit(10)
for x in db.connection.execute(query).fetchall():
print x[0]