gpt4 book ai didi

python - 如何使用 SQLAlchemy 保存 unicode?

转载 作者:太空狗 更新时间:2023-10-29 22:11:15 25 4
gpt4 key购买 nike

我遇到过这样的错误:

File "/vagrant/env/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 435, in do_execute
cursor.execute(statement, parameters)
exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 8410: ordinal not in range(128)

当我尝试使用指定的 Python 的 unicode 字符串保存 ORM 对象时,会发生这种情况。结果 dict parameters 有一个 unicode 字符串作为它的值之一,它在将它强制为 str 类型时产生错误。

我尝试在引擎和列上设置 convert_unicode=True 设置,但没有成功。

那么在 SQLAlchemy 中处理 unicode 的好方法是什么?

更新

这是关于我的设置的一些细节:

表格:

                                    Table "public.documents"
Column | Type | Modifiers
------------+--------------------------+--------------------------------------------------------
id | integer | not null default nextval('documents_id_seq'::regclass)
sha256 | text | not null
url | text |
source | text | not null
downloaded | timestamp with time zone | not null
tags | json | not null
Indexes:
"documents_pkey" PRIMARY KEY, btree (id)
"documents_sha256_key" UNIQUE CONSTRAINT, btree (sha256)

ORM 模型:

class Document(Base):
__tablename__ = 'documents'

id = Column(INTEGER, primary_key=True)
sha256 = Column(TEXT(convert_unicode=True), nullable=False, unique=True)
url = Column(TEXT(convert_unicode=True))
source = Column(TEXT(convert_unicode=True), nullable=False)
downloaded = Column(DateTime(timezone=True), nullable=False)
tags = Column(JSON, nullable=False)

SQLAlchemy 设置:

ENGINE = create_engine('postgresql://me:secret@localhost/my_db',
encoding='utf8', convert_unicode=True)
Session = sessionmaker(bind=ENGINE)

而产生错误的代码只是创建一个 session ,实例化一个Document对象,并用sourcefieldunicode保存它` strign 分配给它。

更新 #2

检查 this repo - 它有自动化的 Vagrant/Ansible 设置,它重现了这个错误。

最佳答案

你的问题在这里:

$ sudo grep client_encoding /etc/postgresql/9.3/main/postgresql.conf
client_encoding = sql_ascii

这导致 psycopg2 默认为 ASCII:

>>> import psycopg2
>>> psycopg2.connect('dbname=dev_db user=dev').encoding
'SQLASCII'

...这有效地关闭了 psycopg2 处理 Unicode 的能力。

你可以在 postgresql.conf 中解决这个问题:

client_encoding = utf8

(然后 sudo invoke-rc.d postgresql reload),或者您可以在创建引擎时明确指定编码:

self._conn = create_engine(src, client_encoding='utf8')

我推荐前者,因为九十年代初期早已一去不复返了。 :)

关于python - 如何使用 SQLAlchemy 保存 unicode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24795444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com