psycopg2 - множественная вставка, но вставка одной общей метки времени - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь вставить несколько таблиц, но у них есть только одна временная метка. Я реализую что-то вроде этого:

for table in table_names:
    current_utc_time = str(datetime.utcnow())
    cursor.execute("INSERT INTO public.{0} VALUES({1}, {2})".format(table, current_utc_time, foo))

Но этот набор кода выдает мне следующую ошибку ...

Traceback (most recent call last):
  File "C:/Users/EricKim/Documents/sage/fake_data_push.py", line 58, in <module>
    cursor.execute("INSERT INTO public.{0} VALUES({1}, {2})".format(table, current_utc_time, df.iloc[row_num, col_num]))
psycopg2.ProgrammingError: syntax error at or near "16"
LINE 1: INSERT INTO public.rt_torqx VALUES(2018-08-30 16:26:35.20088...

Должна быть какая-то ошибка форматирования, но теперь я знаю, что не так, потому что, насколько я понимаю, 2018-08-30 16:26:35.20088 - это правильный формат строкового формата метки времени pgsql. Может кто-нибудь сказать мне, что не так?

1 Ответ

0 голосов
/ 30 августа 2018

Я бы рекомендовал использовать строку Python format() для ваших параметров. Вместо этого используйте psycopg2 параметр, передаваемый через %s, который выполнит преобразование типов для вас. Что-то вроде:

right_now = datetime.utcnow()
cursor.execute(f'INSERT INTO public.{table} VALUES(%s, %s)', (right_now, df.iloc[row_num, col_num],))

(не проверено, но суть 1) использовать f-строку (или .format()) только для имени таблицы, поскольку это не параметр, и 2) использовать заполнители %s для фактических параметров; вам может потребоваться привести значение df через str() ... в зависимости от типа данных, о котором идет речь)

См. http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...