TypeError:参数1必须是字符串或unicode对象

时间:2017-04-25 07:59:19

标签: python unicode psycopg2

使用此查询:

04/25/2017 00:42:28.180 INFO (u"UPDATE posts SET translated_text='Unroll.me CEO dice que es "desgarrador" que los usuarios se molesten Unroll.me vendi\xf3 sus datos de correo electr\xf3nico anonimizado a Uber', detected_language='en' WHERE post_id=2", u'Unroll.me CEO dice que es "desgarrador" que los usuarios se molesten Unroll.me vendi\xf3 sus datos de correo electr\xf3nico anonimizado a Uber')

使用psycopg2,当我使用:cur.execute(query)时,我得到:

TypeError: argument 1 must be a string or unicode object

使用查询和传递unicode值的最佳选择是什么。目前我已经参数化SQL查询并传递'u'。

return u"UPDATE posts SET translated_text='%s', detected_language='%s' WHERE post_id=%s;" % (
        translation, detected_language['language'], str(post_id))

我的补充也没有什么区别:

import psycopg2.extensions

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

1 个答案:

答案 0 :(得分:2)

该日志显示的是unicode字符串的元组,而不是unicode字符串。尝试记录query的类型,然后再执行它以进行检查。

记录参数化查询的首选方法是:

query = u"UPDATE posts SET translated_text='%s', detected_language='%s' WHERE post_id=%s;"
vars = translation, detected_language['language'], str(post_id) # tuple
cur.execute(query, vars)

您可能还希望将vars的字符串显式转换为unicode,而不是依赖于此隐式执行。例如。

vars = translation, detected_language['language'].decode("utf8"), str(post_id).decode("utf8")