Python Psycopg2插入到带有占位符的表中
这可能是一个相当愚蠢的问题,但我做错了什么?它创建了表,但插入不起作用,我想我对占位符做了什么错误Python Psycopg2插入到带有占位符的表中,python,postgresql,postgis,psycopg2,psycopg,Python,Postgresql,Postgis,Psycopg2,Psycopg,这可能是一个相当愚蠢的问题,但我做错了什么?它创建了表,但插入不起作用,我想我对占位符做了什么错误 conn = psycopg2.connect("dbname=postgres user=postgres") cur = conn.cursor() escaped_name = "TOUR_2" cur.execute('CREATE TABLE %s(id serial PRIMARY KEY, day date, elapsed_time varchar, net_time var
conn = psycopg2.connect("dbname=postgres user=postgres")
cur = conn.cursor()
escaped_name = "TOUR_2"
cur.execute('CREATE TABLE %s(id serial PRIMARY KEY, day date, elapsed_time varchar, net_time varchar, length float, average_speed float, geometry GEOMETRY);' % escaped_name)
cur.execute('INSERT INTO %s (day,elapsed_time, net_time, length, average_speed, geometry) VALUES (%s, %s, %s, %s, %s, %s)', (escaped_name, day ,time_length, time_length_net, length_km, avg_speed, myLine_ppy))
conn.commit()
cur.close()
conn.close()
插入呼叫不起作用,它给了我
cur.execute('INSERT INTO %s (day,elapsed_time, net_time, length, average_speed,
geometry) VALUES (%s, %s, %s, %s, %s, %s)'% (escaped_name, day ,time_length,
time_length_net, length_km, avg_speed, myLine_ppy))
psycopg2.ProgrammingError: syntax error at or near ":"
LINE 1: ...h, average_speed, geometry) VALUES (2013/09/01 , 2:56:59, 02...
有人能帮我吗?非常感谢 您正在使用Python字符串格式,这是一个非常糟糕的想法(TM)。想想SQL注入。正确的方法是使用绑定变量:
cur.execute('INSERT INTO %s (day, elapsed_time, net_time, length, average_speed, geometry) VALUES (%s, %s, %s, %s, %s, %s)', (escaped_name, day, time_length, time_length_net, length_km, avg_speed, myLine_ppy))
其中,参数元组作为execute()
的第二个参数给出。另外,您不需要转义任何值,psycopg2将为您进行转义。在这种特殊情况下,还建议不要在变量中传递表名(转义\u name
),而是将其嵌入查询字符串中:psycopg2不知道如何引用表名和列名,只知道引用值
请参阅psycopg2文档:
如果希望以编程方式生成SQL语句,通常的方法是对语句使用Python格式,对参数使用变量绑定。例如,如果表名位于转义\u name
中,则可以执行以下操作:
query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)
显然,要在查询中使用占位符,您需要引用任何以第一种格式引入绑定参数的%
请注意,如果且仅当您的代码忽略任何外部输入(例如,表基名称和计数器)而生成
转义名称时,这是安全的,但如果您使用用户提供的数据,则有SQL注入的风险。自psycopg2 v2.7
起,有一种受支持的方法可以做到这一点:。+1引用文档:警告从不,从不,从不使用Python字符串连接(+)或字符串参数插值(%)将变量传递给SQL查询字符串。“谢谢你,福格,我现在明白了。我在寻找一个解决方案,因为我想自动化创建一个连续数字表的过程,即TOUR+'I',其中'I'将是一个数字,而不总是写一个新的SQL语句。你知道怎么做吗?@TimothyDalton“自动”的惯用方法“生成SQL语句是使用Python格式来构建语句和变量绑定来传递参数。请参阅我的更新答案。再次感谢fog,它现在可以对我的值使用%%
,而不仅仅是%%
。我在网上找不到任何与此相关的信息。第二个%
指示语句从我的第二个参数中获取值,在本例中,args\u tuple
,对吗?@TimothyDalton隐藏在:中当使用参数时,为了在查询中包含一个文本%,可以使用%%string
这里有一个更具体的示例。