Вставка байтов в Postgres с python выдает ошибку, но с PG консоль SQL работает
Я шифрую некоторые данные и пытаюсь вставить их в postgres как байты. Я использую psycopg2 и python. Когда я пытаюсь использовать Python, он выдает ошибку об изменении характера.
Значение ошибки слишком длинное для изменения типа символа (30)
Вступление Exist Passing!
Когда я вставлю его в Postgresql, используя точный вывод оператора SQL, который я использую в python, он будет работать. Я получил оператор с помощью окна консоли eclipse, отобразив переменную, в которой хранится оператор. Это вывод PG Console:
metering=# insert into customers(customer_id,customer_name, inactive, datetime) values (101,'\021;\213D\351O\0339"(($v_\033\262'::bytea,'Y', CURRENT_TIMESTAMP);
INSERT 0 1
^
metering=# select * from customers;
customer_id | customer_name | inactive | datetime
-------------+------------------------------------+----------+------------
101 | \x113b8b44e94f1b3922282824765f1bb2 | Y | 2014-10-06
(1 row)
Определение таблицы базы данных и формат базы данных
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'en_US.UTF-8'
LC_CTYPE = 'en_US.UTF-8'
CONNECTION LIMIT = -1;
customer_id bigint NOT NULL,
customer_name bytea NOT NULL,
inactive character varying(1) NOT NULL,
datetime date NOT NULL,
CONSTRAINT customers_pkey PRIMARY KEY (customer_id)
Ошибки, возвращаемые Python
2014-10-16 12:19:23,077 ERROR Error invalid byte sequence for encoding "UTF8": 0xca 0x3c
2014-10-16 12:20:47,796 ERROR Error invalid byte sequence for encoding "UTF8": 0xca 0x3c
Код для вставки зашифрованного имени клиента.
password = hashlib.sha256(secretmofokey).digest()
IV = 16 * '\x00'
mode = AES.MODE_CBC
encryptor = AES.new(password, mode, IV=IV)
for customer_id, customer_name, inactive in oracle_cursor:
try:
encrypted_customer_name = encryptor.encrypt(pad(customer_name))
pg_delete.execute("""delete from customers where customer_id = %s """ % customer_id)
customers_sql = ("""insert into customers(customer_id,
customer_name , inactive, datetime)
values (%s, '%s', '%s' , CURRENT_TIMESTAMP) """ % (customer_id, encrypted_customer_name, inactive))
pg_insert.execute(customers_sql)
postgres.commit()
except psycopg2.DatabaseError, e:
logging.error('Error %s' % e)
postgres.rollback()
continue
1 ответ
В соответствии с руководством по psycopg2 вы должны явно указать данные, которые вы хотите вставить, как байт:
Вы также неправильно пытаетесь указать свои спецификаторы формата. Вы не должны и не должны включать в себя одинарные кавычки %s
; psycopg2 сделает соответствующее цитирование.
Итак, вы хотите:
"""... values (%s, %s, %s , CURRENT_TIMESTAMP) """
% (customer_id, psycopg2.Binary(encrypted_customer_name), inactive)