Задать вопрос
@Doremi777

Как загрузить данные в таблицу из csv в postgres с помощью python (psycopg2)?

Я создал таблицу на удаленном сервере и пытаюсь загрузить в нее данные из файла, который находится у меня на локальном компьютере (OS windows) с помощью python скрипта.
conn = psycopg2.connect(
    host = '--.--.---.---',
    database = 'test_db',
    user = 'postgres',
    password = 'admin'
)
conn.autocommit = True
cursor = conn.cursor()


sql2 = '''COPY registration_table(date_start,id_dogovor,\
tarif, tarif_next, channel, address_street_home  )
FROM 'C:\\pythonVscode\\data\\registration_table_02_.csv'
DELIMITER ','
CSV HEADER;'''

cursor.execute(sql2)

На выходе получается такая ошибка:
UndefinedFile: could not open file "C:\pythonVscode\data\registration_table_02_.csv" for reading: No such file or directory
HINT: COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \copy.

Я так понимаю он ищет файлы на сервере, а нужно как-то передать с помощью скрипта...
  • Вопрос задан
  • 798 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
@o5a
Как и написано в ошибке, 'copy' предназначено для чтения файла с сервера.
Варианты:

1. Закинуть этот файл CSV на сервер и запускать так.
2. Использовать вместо этого '\copy', она позволяет читать локальный файл, но для этого на компьютере должен быть рабочий psql.exe. Т.е. вместо прямого коннекта через psycopg написать скрипт запуска \copy с использованием локального psql
3. Просто самому читать этот CSV в скрипте и писать в таблицу напрямую, через execute/executemany
Ответ написан
Комментировать
@itrader
В чем проблема загрузить файл по ssh на сервер?
Ответ написан
Комментировать
erge
@erge
Примус починяю
Если прям вот вообще надо исключительно через скрипт и исключительно через python, то
читаешь csv файл построчно, собираешь в массив, отправляешь batch insert в постгрис.
см. executemany(query, vars_list)

tuples = ((123, "foo"), (42, "bar"), (23, "baz"))
cur.executemany("INSERT INTO test (num, data) VALUES (%s, %s)", tuples)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы