Массовая загрузка с помощью специальных символов с использованием Python - PullRequest
0 голосов
/ 13 июня 2018

В настоящее время я использую «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: отсутствуют данные для столбца» с некоторым именем столбца.Я попытался удалить запятую из данных с помощью замены, я все еще получаю сообщение об ошибке с другим именем столбца.

1 Ответ

0 голосов
/ 13 июня 2018

использовать формат 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)
...