使用 Python 批量加载特殊字符

Bulk loading with special characters using Python

我目前正在使用 "copy_from" 进行批量加载,但似乎由于数据中存在双引号而出错。

engineor = create_engine('oracle+cx_oracle://xxxx:xxxx@xxxxx:xxxx/?service_name=xxxxx')
sql = "select * from xxxxxx WHERE ROWNUM <= 10"
df = pd.read_sql(sql, engineor)

enginegp = create_engine('xxxxx@xxxxx:xxxx/xxxx')
connection = enginegp.raw_connection()
output = io.StringIO()
df.to_csv(output, sep='\t', header=False, index=False)
output.seek(0)
output.getvalue()
cur = connection.cursor()
cur.copy_from(output, 'test', null="")
connection.commit()
cur.close()

我得到的错误是 "DataError: missing data for column" 带有一些列名。我尝试使用替换从数据中删除逗号,但我仍然收到带有不同列名的错误。

使用 CSV 格式而不是尝试伪造 postgresql TSV 格式。 与 CSV 不同,TSV 不使用引号。 TSV 格式要求对非打印字符使用 C 转义符 - 如果您的数据包含任何换行符,您最终会得到看起来很短的行。如果它包含任何选项卡,您将获得长行。

要执行 CSV,您需要使用 copy_expert,这将授予访问 postgresql 复制命令支持的所有选项的权限,包括 CSV 支持。

df.to_csv(output, header=False, index=False)

...

cur.copy_expert("COPY test FROM STDIN WITH CSV NULL '' ", output)