【问题标题】:Pass encoding parameter to cx_oracle from sqlalchemy从 sqlalchemy 将编码参数传递给 cx_oracle
【发布时间】:2018-06-14 05:54:20
【问题描述】:

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

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

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

代码如下:

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' 传递给 sqlalchemy 在底层使用的 cx_oracle?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    参考:cx_oracle Documentation

    【讨论】:

    • 链接失效了
    【解决方案2】:

    SQLAlchemy create_engine 允许您通过 connect_args 参数将附加参数传递给底层 cx_Oracle 的 connect() create_engine

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 2014-11-27
      • 1970-01-01
      相关资源
      最近更新 更多