我在python 3.4中有一些批量postgresql 9.3.9数据插入。我一直在使用SQLAlchemy,它适用于正常的数据处理。有一段时间我一直在使用psycopg2,以便利用copy_from
函数,我发现在批量插入时更快。我遇到的问题是,当使用copy_from
时,如果我的数据中包含一些special
个字符,则批量插入会失败。当我删除突出显示的行时,插入成功运行。
错误
Traceback (most recent call last):
File "/vagrant/apps/data_script/data_update.py", line 1081,
in copy_data_to_db
'surname', 'other_name', 'reference_number', 'balance'), sep="|", null='None')
psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0x00
CONTEXT:
COPY source_file_raw, line 98: "94|1|99|2015-09-03 10:17:34|False|True|John|Doe|A005-001\008020-01||||||..."
产生错误的代码
cursor.copy_from(data_list, 'source_file_raw',
columns=('id', 'partner_id', 'pos_row', 'loaded_at', 'has_error',
'can_be_loaded', 'surname', 'other_name', 'reference_number', .............),
sep="|", null='None')
数据库连接
import psycopg2
pg_conn_string = "host='%s' port='%s' dbname='%s' user='%s' password='%s'"
%(con_host, con_port, con_db, con_user, con_pass)
conn = psycopg2.connect(pg_conn_string)
conn.set_isolation_level(0)
if cursor_type == 'dict':
cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
else:
cursor = conn.cursor()
return cursor
令人费解的是,即使存在那些“特殊字符”但是使用psycopg2直接失败,SQlAlchemy也可以进行批量插入。我认为必须有一种方法让我逃避这个或告诉psycopg2找到一个聪明的方法来插入或我错过了某个地方的设置?