Psycopg2 UNICODEARRAY

Psycopg2 UNICODEARRAY

我有这个代码:

#!/usr/bin/python
import psycopg2
import psycopg2.extensions

conn = psycopg2.connect(dbname='my_database_name', ...)
cur = conn.cursor()

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

cur.execute("SELECT * FROM t0;")
res = cur.fetchall()

print conn.encoding
print res
print res[0][0] # Output is true
print [res[0][0]]

但输出是:

UTF8
[(u'\u0410\u0411', u'\u0412\u0413')]
АБ
[u'\u0410\u0411']

为什么只有第三行是真的?字母上的u'\u***'怎么改?

这里的问题只是 Python 2 打印 unicode 类型的方式,这也是 Python 3 在 2008 年创建的原因之一。

在Python 2

$ python2
>>> s = u'АБ'
>>> type(s)
<type 'unicode'>
>>> print(s)
АБ
>>> print([s])
[u'\u0410\u0411']

但是在Python3

$ python3
>>> s = u'АБ'
>>> type(s)
<class 'str'>    
>>> print(s)
АБ
>>> print([s])
['АБ']

您问题 "how to make printing of an array of strings better" 的最简单答案是 "Use Python 3!"

但是,不幸的是,您可能会被 Python 2 困住(如果是这种情况,我们深表歉意)。如果你坚持使用 Python 2,你可以伪造它:

$ python2
>>> s = u'АБ'
>>> print([s])
[u'\u0410\u0411']
>>> print('[' + ''.join(s) + ']')
[АБ]

虽然不漂亮,但很管用。希望您能够切换到 Python 3。(或者其他人对 Python 2 的回答可能比这个 hack 更好。)