python 3 和 LInux 上的 sqlite 出现 Unicode 错误
Unicode error with python 3 and sqlite on LInux
我有一个 Python 程序可以根据 SQL 数据库中的数据生成报告。对于 CI 管道测试,我使用以下命令在内存中创建了一个 sqlite3 数据库:
from sqlaclhemy import create_engine
eng = create_engine("sqlite:///")
con = eng.connect()
我从一堆 csv 文件(都是 utf8)初始化这个数据库,文件名是 table 名称,第一行是 headers。初始化是这样完成的:
import petl as etl
for file in folder:
filename = os.path.splittext(os.path.basename(os.path.absname(file))[0])
data = etl.fromcsv(file, delimiter='|', encoding="utf8")
etl.todb(csvTable, con, filename, create=true)
此数据库随后用于 运行 测试应用程序。
所有测试在我的 Windows-10 开发机器上运行良好,但是当我推送到 git 并且 CI-job 被触发时(CI 工作 运行 在基于 centos7 的 docker 容器中),测试失败。经过一些调试后,我设法通过以下代码片段找到了失败的根本原因:
results = etl.fromdb(con, "SELECT * FROM PERSONS")
print(results)
导致以下错误:
UnicodeEncodeError: 'ascii' codec can't encode character '\xe4' in position 317: ordinal not in range(128)
知道是什么原因造成的。 sqlalchemy 和 sqlite 都应该默认使用 utf8。为什么我的代码在 windows 中有效,但在 linux 中无效。我已经尝试解决这个问题一天了,但我很困惑。感谢任何帮助。
Python 是 3.6.8 版,我的 windows 和 linux 机器上的所有软件包都是相同的版本。
PS 打印命令用于演示问题(测试字体使用 print())。实际问题是,当查询包含 Unicode 字符(在本例中为 'ä')的 table 时,结果为空。
好的,根据 Klaus 的评论,问题出在区域设置上。我们的 docker 容器没有 localectl 进程,即使在 /etc/locale.conf 中设置了语言环境,系统默认为 POSIX。添加 LANG 环境变量解决了问题。
我有一个 Python 程序可以根据 SQL 数据库中的数据生成报告。对于 CI 管道测试,我使用以下命令在内存中创建了一个 sqlite3 数据库:
from sqlaclhemy import create_engine
eng = create_engine("sqlite:///")
con = eng.connect()
我从一堆 csv 文件(都是 utf8)初始化这个数据库,文件名是 table 名称,第一行是 headers。初始化是这样完成的:
import petl as etl
for file in folder:
filename = os.path.splittext(os.path.basename(os.path.absname(file))[0])
data = etl.fromcsv(file, delimiter='|', encoding="utf8")
etl.todb(csvTable, con, filename, create=true)
此数据库随后用于 运行 测试应用程序。
所有测试在我的 Windows-10 开发机器上运行良好,但是当我推送到 git 并且 CI-job 被触发时(CI 工作 运行 在基于 centos7 的 docker 容器中),测试失败。经过一些调试后,我设法通过以下代码片段找到了失败的根本原因:
results = etl.fromdb(con, "SELECT * FROM PERSONS")
print(results)
导致以下错误:
UnicodeEncodeError: 'ascii' codec can't encode character '\xe4' in position 317: ordinal not in range(128)
知道是什么原因造成的。 sqlalchemy 和 sqlite 都应该默认使用 utf8。为什么我的代码在 windows 中有效,但在 linux 中无效。我已经尝试解决这个问题一天了,但我很困惑。感谢任何帮助。
Python 是 3.6.8 版,我的 windows 和 linux 机器上的所有软件包都是相同的版本。
PS 打印命令用于演示问题(测试字体使用 print())。实际问题是,当查询包含 Unicode 字符(在本例中为 'ä')的 table 时,结果为空。
好的,根据 Klaus 的评论,问题出在区域设置上。我们的 docker 容器没有 localectl 进程,即使在 /etc/locale.conf 中设置了语言环境,系统默认为 POSIX。添加 LANG 环境变量解决了问题。