Использование psycopg2 для КОПИРОВАНИЯ в таблицу со столбцом ARRAY INT

Я создал таблицу со структурой, подобной следующей:

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}'"

Что я должен делать ?

Также будет интересно узнать, почему первый код не выдает ошибку.

Изменение символа кавычки на " позволяет мне успешно использовать команду copy из psql, но я все равно получаю ту же ошибку, что и выше в python: `DataError: malformed array literal:" "{1,2,3}" "`

nanounanue 27.11.2018 18:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
1
668
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

This code doesn't throw an error, but It doesn't write anything to the table.

Код работает хорошо, если вы фиксируете транзакцию:

cursor.close()
connection.commit()

Вы совершенно правы! Я предполагал, что autocommit был на

nanounanue 03.12.2018 18:31

Другие вопросы по теме