Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Psycopg2插入到带有占位符的表中_Python_Postgresql_Postgis_Psycopg2_Psycopg - Fatal编程技术网

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
这里有一个更具体的示例。