Запись csv строки в базу данных PostgreSQL при помощи Python
Пытаюсь записать csv строку в базу данных PostgreSQL при помощи Python. Строку (lines) получаю из интернета.
Вид строки из интернета: ['[MSNG],5,06/10/21,10:00:00,2.2970000,2.3120000,2.2970000,2.3120000,161000',...]
Привожу строку к следующему виду(с помощью кода см.ниже): ['[MSNG]', '5', '06/10/21', '10:00:00', '2.2970000', '2.3120000', '2.2970000', '2.3120000', '161000',...]
Код: '''
query = ",".join('?' * len(lines[0].split(",")))
query = '({0})'.format(query)
query = ",".join([query] * len(lines))
query = 'INSERT INTO fin VALUES ' + query
lines = ",".join(lines).split(",")
print(lines)
cursor = connection.cursor()
cursor.execute(query, lines)
cursor.commit()
'''
Ошибка:
psycopg2.errors.SyntaxError: ОШИБКА: ошибка синтаксиса (примерное положение: ",") LINE 1: INSERT INTO fin VALUES (?,?,?,?,?,?,?,?,?),(?,?,?,?,?,?,?,?,...
^

Ответы (2 шт):
Синтаксис INSERT выглядит так
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
Поскольку вы не указываете столбцы, то для вас он такой
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
в вашем случае в query будет что то типа такого
INSERT INTO fin VALUES (?,?,?,?,?,?,?,?,?) ['[MSNG]', '5', '06/10/21', '10:00:00', '2.2970000', '2.3120000', '2.2970000', '2.3120000', '161000']
В этом есть две проблемы
- Перечисление Columns не обязательно, можно его убрать
- Values должны быт ьв круглых скобках
Собственно предлагаю два варианта:
# Вариант с сырым запросом
query = f"INSERT INTO fin VALUES ({lines[0]})"
print(query)
cursor = connection.cursor()
cursor.execute(query)
cursor.commit()
или
# Вариант с подстановкой через $
query = ", ".join([f"${i + 1}" for i in range(len(lines[0].split(",")))])
query = f"INSERT INTO fin VALUES ({query})"
lines = ",".join(lines).split(",")
print(query)
print(lines)
cursor = connection.cursor()
cursor.execute(query, lines)
cursor.commit()
Но глобально код тяжело читается, не рекомендую такое использовать в продакшене - только для личных скриптов/лабараторных и тд
Проблема была решена.
Не так:
INSERT INTO fin VALUES (?,?,?,?,?,?,?,?,?)
Для PostgreSQL применяется:
INSERT INTO fin VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)
lines = [line.split(',') for line in lines]
query = ",".join(("%s" for _ in range(len(lines[0]))))
# print(query)
query = f'INSERT INTO get_finance ("TICKER", "PER", "DATE", "TIME", "OPEN", "HIGH", "LOW", "CLOSE", "VOL") VALUES({query}) '
# print(repr(query))
cursor = connection.cursor()
cursor.executemany(query, lines)
connection.commit()
Код был изменен из-за использования другой таблицы (query).