Я создал таблицу со структурой, подобной следующей:
create table some_table (
id serial,
numbers int []
);
Я хочу скопировать фрейм данных pandas эффективным способом, поэтому я не хочу использовать медленный метод to_sql, поэтому, следуя https://stackoverflow.com/a/41876462/754176 и https://stackoverflow.com/a/29125940/754176, я попробовал следующее:
import pandas as pd
import psycopg2
# Create the connection, and the cursor (ommited)
# Function from the second link
def lst2pgarr(alist):
return '{' + ','.join(alist) + '}'
df = pd.DataFrame({'numbers': [[1,2,3], [4,5,6], [7,8,9]]})
df['numbers'] = df.numbers.apply(lambda x: lst2pgarr([str(y) for y in x]))
import io
f = io.StringIO()
df.to_csv(f, index=False, header=False, sep = "|")
f.seek(0)
cursor.copy_from(f, 'some_table', columns=["numbers"], sep='|')
cursor.close()
Этот код не выдает ошибки, но ничего не записывает в таблицу.
Итак, я изменил код на
import csv
df = pd.DataFrame({'numbers': [[1,2,3], [4,5,6], [7,8,9]]})
df['numbers'] = df.numbers.apply(lambda x: lst2pgarr([str(y) for y in x]))
f = io.StringIO()
df.to_csv(f, index=False, header=False, sep = "|", quoting=csv.QUOTE_ALL, quotechar = "'"))
f.seek(0)
cursor.copy_from(f, 'some_table', columns=["numbers"], sep='|')
cursor.close()
Этот код вызывает следующую ошибку:
---------------------------------------------------------------------------
DataError Traceback (most recent call last)
<ipython-input-40-3c58c4a64abc> in <module>
----> 1 cursor.copy_from(f, 'some_table', columns=["numbers"], sep='|')
DataError: malformed array literal: "'{1,2,3}'"
DETAIL: Array value must start with "{" or dimension information.
CONTEXT: COPY some_table, line 1, column numbers: "'{1,2,3}'"
Что я должен делать ?
Также будет интересно узнать, почему первый код не выдает ошибку.






This code doesn't throw an error, but It doesn't write anything to the table.
Код работает хорошо, если вы фиксируете транзакцию:
cursor.close()
connection.commit()
Вы совершенно правы! Я предполагал, что autocommit был на
Изменение символа кавычки на
"позволяет мне успешно использовать командуcopyизpsql, но я все равно получаю ту же ошибку, что и выше вpython: `DataError: malformed array literal:" "{1,2,3}" "`