我试图插入多个表,但让它们仅共享一个时间戳。我正在执行这样的事情:
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时间戳字符串格式的正确格式。谁能告诉我怎么了?
答案 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