将编码参数从 sqlalchemy 传递给 cx_oracle

Kap*_*cko 6 encoding cx-oracle sqlalchemy python-3.x flask-sqlalchemy

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

cx_Oracle.connect(username, password, conn_str, encoding='UTF-16', nencoding='UTF-16')
Run Code Online (Sandbox Code Playgroud)

但是,现在我正在构建更大的应用程序,我想SQLalchemyFlask.

代码如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

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

所以我的问题是,如何将参数传递encoding='UTF-16', nencoding='UTF-16'给 sqlalchemy 在底层使用的 cx_oracle?

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

cow*_*ert 6

SQLAlchemy允许您通过以下参数create_engine将附加参数传递给底层 cx_Oracle :connect()connect_argscreate_engine

import cx_Oracle
e = create_engine(
    "oracle+cx_oracle://user:pass@connstr...",
    connect_args={
        "encoding": "UTF-16",
        "nencoding": "UTF-16"
    }
)
Run Code Online (Sandbox Code Playgroud)

设置NLS_LANG实际上对我不起作用,但我认为这是因为我在 Cygwin 中并且有一些其他怪癖(例如我实际上想动态设置编码,并且即使我确实设法获取 NLS_LANG 我也必须重新加载 cx_Oracle上班)。使用这种方法对我有用。

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


Kap*_*cko 1

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

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

参考:cx_oracle 文档