将编码参数从sqlalchemy传递给cx_oracle

时间:2018-01-04 13:24:47

标签: python-3.x encoding sqlalchemy flask-sqlalchemy cx-oracle

我使用带有UTF-16编码的Oracle数据库。直接使用cx_oracle客户端时,正确显示变音符号。连接语句是这样的:

cx_Oracle.connect(username, password, conn_str, encoding='UTF-16', nencoding='UTF-16')

但是,现在我正在构建更大的应用程序,我想在SQLalchemy中使用Flask

代码如下所示:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy(app)
db.Model.metadata.reflect(db.engine)

class MyTable(db.Model):
    __table__ = db.Model.metadata.tables['mytable']

for row in MyTable.query:
    print(row.column_with_diacritics)

上述代码的输出:aoe 但是数据库中的列值是:áóé

所以我的问题是,如何将参数encoding='UTF-16', nencoding='UTF-16'传递给cx_oracle哪个sqlalchemy使用发动机罩?

感谢您提出任何建议或其他解决方法。

2 个答案:

答案 0 :(得分:1)

SQLAlchemy create_engine允许您通过connect()的{​​{1}}参数将其他参数传递给基础cx_Oracle的connect_args

create_engine

设置import cx_Oracle e = create_engine( "oracle+cx_oracle://user:pass@connstr...", connect_args={ "encoding": "UTF-16", "nencoding": "UTF-16" } ) 实际上对我不起作用,但是我认为这是因为我在Cygwin中并且还有其他一些怪癖(例如,我实际上想动态设置编码,因此必须重新加载cx_Oracle即使我确实设法让NLS_LANG正常工作)。使用这种方法对我有用。

源:(SQLAlchemy Oracle方言源代码): https://github.com/zzzeek/sqlalchemy/blob/560452acd292c8a9a57db032378a6342f16448c6/lib/sqlalchemy/dialects/oracle/cx_oracle.py#L37

答案 1 :(得分:0)

我发现可以通过环境变量NLS_LANG传递此设置。

所以,在我的用例中,我必须设置:NLS_LANG=.AL32UTF8(而不是UTF16)。

参考:implode()