psycopg2-多次插入,但插入一个通用时间戳

时间:2018-08-30 16:32:12

标签: python postgresql timestamp psql

我试图插入多个表,但让它们仅共享一个时间戳。我正在执行这样的事情:

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 :(得分:1)

对于参数,我建议不要使用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占位符用于实际参数您可能需要通过str()强制转换df值...取决于所讨论的数据类型)

请参见http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries