python插入到postgres上的psycopg2 unicode字符

时间:2016-01-04 22:52:00

标签: python-2.7 unicode psycopg2 postgresql-9.3 pgdb

大家好我在将utf-8 unicode字符插入数据库时​​遇到问题。

我从表单中获取的unicode是u'AJDUK MARKO\u010d'。下一步是将其解码为utf-8。 value.encode('utf-8')然后我收到一个字符串' AJDUK MARKO \ xc4 \ x8d'。

当我尝试更新数据库时,对插入btw工作原理相同。

cur.execute( "UPDATE res_partner set %s = '%s' where id = %s;"%(columns, value, remote_partner_id))

该值会被插入或更新到数据库,但问题是它与AJDUK MARKO\xc4\x8d的格式完全相同,当然我想要AJDUK MARKOČ。数据库具有utf-8编码,因此不是这样。

我做错了什么?令人惊讶的是,在论坛上找不到任何有用的东西。

1 个答案:

答案 0 :(得分:4)

\xc4\x8dČ的UTF-8编码表示。看起来插件已经工作但是您没有正确打印结果,可能是将整行打印为列表。即。

>>> print "Č"
"Č"
>>> print ["Č"] # a list with one string
['\xc4\x8c']

我们需要查看更多代码才能验证(尽可能多地提供可重现的代码总是一个好主意。)

您可以解码结果(result.decode("utf-8")),但应避免手动编码或解码。 Psycopg2已允许您发送Unicodes,因此您无需先编码即可执行以下操作:

cur.execute( u"UPDATE res_partner set %s = '%s' where id = %s;" % (columns, value, remote_partner_id))

- 请注意领先的u

Psycopg2也可以通过自动解码字符串来返回Unicodes:

import psycopg2
import psycopg2.extensions
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

修改

SQL值应作为参数传递给.execute()。请参阅http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters

上的大红框

相反 E.g。

# Replace the columns field first.
# Strictly we should use http://initd.org/psycopg/docs/sql.html#module-psycopg2.sql  
sql = u"UPDATE res_partner set {} = %s where id = %s;".format(columns) 
cur.execute(sql, (value, remote_partner_id))