gpt4 book ai didi

python - 使用 python 将字节插入 Postgres 会出错,但是使用 PG SQL 控制台可以

转载 作者:行者123 更新时间:2023-11-29 13:29:57 24 4
gpt4 key购买 nike

我正在加密一些数据并尝试将其作为字节插入到 postgres 中。我正在使用 psycopg2 和 python。当我从 python 尝试时,它给我一个关于不同字符的错误。

类型字符变化的错误值太长(30)

条目存在通过!

当我使用我在 python 中使用的 SQL 语句的准确输出将它插入到 Postgresql 中时,它将起作用。我通过显示存储语句的变量,使用 eclipse 控制台窗口获得了语句。这是 PG 控制台输出:

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

最佳答案

Per the psycopg2 manual ,您必须明确标识要插入的数据为 bytea:

您还错误地尝试引用您的格式说明符。您不需要也不应该在 %s 周围包含单引号; psycopg2 将进行适当的引用。

所以你想要:

"""... values (%s, %s, %s , CURRENT_TIMESTAMP) """
% (customer_id, psycopg2.Binary(encrypted_customer_name), inactive)

关于python - 使用 python 将字节插入 Postgres 会出错,但是使用 PG SQL 控制台可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26219512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com