Я создал таблицу со структурой, похожей на следующую:
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}'"
Что мне делать?
Также будет интересно узнать, почему первый код не выдает ошибку.