从 sqlalchemy 将编码参数传递给 cx_oracle
Pass encoding parameter to cx_oracle from sqlalchemy
我正在使用 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?
感谢您的任何建议或其他解决方法。
我发现可以通过环境变量 NLS_LANG
传递此设置。
因此,在我的用例中,我必须设置:NLS_LANG=.AL32UTF8
(而不是 UTF16)。
SQLAlchemy create_engine
允许您通过 create_engine
的 connect_args
参数将附加参数传递给基础 cx_Oracle 的 connect()
:
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
我正在使用 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?
感谢您的任何建议或其他解决方法。
我发现可以通过环境变量 NLS_LANG
传递此设置。
因此,在我的用例中,我必须设置:NLS_LANG=.AL32UTF8
(而不是 UTF16)。
SQLAlchemy create_engine
允许您通过 create_engine
的 connect_args
参数将附加参数传递给基础 cx_Oracle 的 connect()
:
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