Вставка байтов в 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)
Другие вопросы по тегам