psycopg2 не вставляет данные Unicode

У меня есть скрипт, который берет данные из одной базы данных и в соответствии с именами таблиц и полей копирует их в другую базу данных. Вопрос касается данных 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, но в этом случае у меня ошибка

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...
                                                            ^

Что здесь нужно сделать?

1 ответ

Решение

Не готовьте свою строку со значениями, запеченными в (используя форматирование строки или конкатенацию).

Вместо этого передайте свои значения .execute метод в качестве аргумента.

Например

sql = 'INSERT INTO {} ({})  VALUES (%s, %s, %s);'.format('"tb_names"', '"num", "name", "district"') 
cur_2.execute(sql, (23, u'Рынок', u'Волжский'))
Другие вопросы по тегам