psycopg3 中的 UTF-8

UTF-8 in psycopg3

我正在将使用 psycopg2 的 python 代码库重构为 psycopg3。

代码调用了 psycopg3 中不存在的 <cursor>.mogrify()

代码有类似这样的东西确保字符串是 UTF-8:

arg_str = cur.mogrify("(%s,%s,%s,%s,%s)", x)
args_list.append(arg_str)
args_str = b','.join(args_list).decode("utf-8")
cur.execute(insert_query + args_str)

在新代码库中,我将 client_encoding="UTF8" 添加到 psycopg.connect() 调用

我还需要做这样的事情来确保字符串在传递给 execute() 时是 UTF8 格式吗?

cur.execute("INSERT INTO data(name) values (%s)", name.encode("utf-8").decode())

在 psycopg2 和 psycopg3 中处理编码的正确方法是

  • 在连接上或通过 SET client_encoding TO ...
  • 设置编码
  • str 值传递给 cursor.execute 并让连接器处理编码(和解码)

所以使用 psycopg3 的正确代码是

cur.execute("INSERT INTO data(name) values (%s)", (name,))

请参阅 string adaptation 的文档。

问题中的 psycopg2 代码似乎不必要地复杂,像这样的东西也可以工作(假设 Python3):

x = ('a', 'b', 'c', 'd', 'e')
placeholders = ','.join(['%s'] * len(x))
insert_query = """INSERT INTO tbl (c1, c2, c3, c4, c5) VALUES ({})""".format(placeholders)
cur.execute(insert_query, args)