Postgresql psycopg2不插入unicode数据

Postgresql psycopg2不插入unicode数据,postgresql,unicode,psycopg2,Postgresql,Unicode,Psycopg2,我有一个脚本,它从一个数据库中获取数据,并根据表的名称和字段将其复制到另一个数据库中。 问题是关于unicode数据,我需要插入一些俄语单词,但每次psycopg2将其作为默认字符串写入时 import psycopg2 import psycopg2.extensions conn_two = psycopg2.connect(user="postgres", password="password", host = "localhost", port= "5432", dbname = "b

我有一个脚本,它从一个数据库中获取数据,并根据表的名称和字段将其复制到另一个数据库中。 问题是关于unicode数据,我需要插入一些俄语单词,但每次psycopg2将其作为默认字符串写入时

import psycopg2
import psycopg2.extensions

conn_two = psycopg2.connect(user="postgres", password="password", host = "localhost", port= "5432", dbname = "base2")
cur_2  = conn_two.cursor()
sql = 'INSERT INTO {} ({})  VALUES {};'.format('"tb_names"', '"num", "name", "district"',  (23, 'Рынок', 'Волжский')) 
cur_2.execute(sql)
conn_two.commit()
以下是pgAdmin4中的结果:

我还尝试用unicode设置extensions和插入数据,但在本例中出现了一个错误

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

conn_two = psycopg2.connect(user="postgres", password="password", host = "localhost", port= "5432", dbname = "base2")
conn_two.set_client_encoding("utf-8")
conn_two.set_client_encoding('UNICODE')
cur_2  = conn_two.cursor()
sql = 'INSERT INTO {} ({})  VALUES {};'.format('"tb_names"', '"num", "name", "district"',  (23, u'Рынок', u'Волжский')) 
cur_2.execute(sql)
conn_two.commit()


Traceback (most recent call last):
  File "D:\_Scripts\pgadmin.py", line <>, in <module>
    cur_2.execute(sql)
psycopg2.ProgrammingError: ОШИБКА:  тип "u" не существует # - says that type "u" does not exist
LINE 1: ...ing_ex" ("num", "name", "district")  VALUES (23, u'\u0420\u...
                                                            ^
导入psycopg2
导入psycopg2.extensions
psycopg2.extensions.register_类型(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_类型(psycopg2.extensions.UNICODEARRAY)
conn_two=psycopg2.connect(user=“postgres”,password=“password”,host=“localhost”,port=“5432”,dbname=“base2”)
连接2.设置客户端编码(“utf-8”)
conn\u two.set\u client\u编码('UNICODE')
cur_2=conn_two.cursor()
sql='插入到{}({})值{};'。格式(“‘tb_名称’、“‘num’、‘名称’、‘地区’、(23,u’Пыыыыыыжыыыыыыы
cur_2.execute(sql)
conn_two.commit()
回溯(最近一次呼叫最后一次):
文件“D:\\u Scripts\pgadmin.py”,第行,在
cur_2.execute(sql)
psycopg2.ProgrammingError:БББСА:ПП“u”###-表示类型“u”不存在
第1行:…ing_ex”(“num”,“name”,“district”)值(23,u'\u0420\u。。。
^

这里应该做什么?

不要准备带有烘焙值的字符串(使用字符串格式或串联)

相反,请使用SQL字符串中的
%s
作为占位符,然后将值作为参数传递给
.execute
方法

如果您使用的是Python2.x,那么非ASCII字符串应该作为Unicode类型传递

例如

python2.x

sql = 'INSERT INTO "tb_names" ("num", "name", "district") VALUES (%s, %s, %s);'
cur_2.execute(sql, (23, u'Рынок', u'Волжский'))
sql = 'INSERT INTO "tb_names" ("num", "name", "district") VALUES (%s, %s, %s);'
cur_2.execute(sql, (23, 'Рынок', 'Волжский'))
Python3.x

sql = 'INSERT INTO "tb_names" ("num", "name", "district") VALUES (%s, %s, %s);'
cur_2.execute(sql, (23, u'Рынок', u'Волжский'))
sql = 'INSERT INTO "tb_names" ("num", "name", "district") VALUES (%s, %s, %s);'
cur_2.execute(sql, (23, 'Рынок', 'Волжский'))

肯定是Python2.x?@AlastairmccormackPython2.7QuickFix-尝试在SQL语句中添加一个
u
SQL=u'INSERT-INTO{}({})值{};'.format('tb_-names','num','name','district',(23,u'Пъъжжжжl'))
@AlastairMcCormack brilliant!我在可读性更强的视图中编写了它。
sql=u'INSERT-INTO{}({})value({});'。格式(“tb_名称”,u“num,name,district”,u“23,”“”“”“”
我认为更好的解决方案是将值传递给
。改为执行
。请参阅下面的答案。但我应该使用字符串格式或串联?解决方案是什么?请参阅更新的答案,这样可以消除一些歧义。