Python 用';%参数化的SQL查询是什么s';看起来像
考虑表单中的特定SQL查询Python 用';%参数化的SQL查询是什么s';看起来像,python,mysql,sql,Python,Mysql,Sql,考虑表单中的特定SQL查询 cursor.execute(string, array) 其中string是包含'%s'的某个字符串,array是满足len(array)==string.count(“%s”)的某个数组,不一定只包含字符串 例如: cursor.execute("INSERT INTO tablename(col_one, col_two, col_three) VALUES (%s,%s,%s)",("text", 123, datetime.time(12,0))) 当我
cursor.execute(string, array)
其中string是包含'%s'
的某个字符串,array是满足len(array)==string.count(“%s”)
的某个数组,不一定只包含字符串
例如:
cursor.execute("INSERT INTO tablename(col_one, col_two, col_three) VALUES (%s,%s,%s)",("text", 123, datetime.time(12,0)))
当我运行此命令时,我会收到一条毫无帮助的错误消息“您的SQL语法有错误…”,然后是查询的部分文本。然而,为了调试这个,我想知道查询的全文
运行查询cursor.execute(string,array)
时,光标执行的查询的实际文本是什么?如您所知:
语法:
cursor.execute(操作,参数=None,multi=False)
iterator=cursor.execute(operation,params=None,multi=True)
此方法执行给定的数据库操作(查询或命令)。
元组或字典参数中的参数绑定到
操作中的变量使用%s
或%(名称)s
参数样式(即,使用格式或pyformat样式)<代码>执行()
如果multi
为True
,则返回迭代器
因此,当您使用%s
时,它将用参数
列表中的值替换该值
如果要调试语句,可以使用光标打印上次执行的查询。_last_executed:
try:
cursor.execute(sql, (arg1, arg2))
connection.commit()
except:
print("Error: "+cursor._last_executed)
raise
finally :
print(cursor._last_executed)
您的
字符串实际上是您的参数化查询,您应该在其中传递元素以匹配%s
你可以在
注意这里的参数不是数组中的,而是元组中的
你的例子变成:
cursor.execute("INSERT INTO tablename(col_one, col_two, col_three) VALUES (%s,%s,%s)", ('text', 123, datetime.time(12,0)))
我还将您的“
更改为”
,因为我怀疑它是否太喜欢它
我也不确定日期格式,如果仍然有问题,请尝试不使用日期(如果需要,请修复日期格式)。什么是框架cursor.execute()
框架的一部分是MySQL。这是使用?是的,是python API。我对python一无所知,但这不是参数化查询通常的工作方式。参数值单独发送到MySQL,不会注入SQL字符串。因此,参数值永远不会导致语法错误(这就是重点)。关于“当您使用%s时,它将用参数列表中的值替换该值”的说法如何与阿尔瓦罗关于参数值未注入SQL字符串的评论相一致?@Someone\u other:它将转义该序列以防止SQL注入。这就是为什么它的行为不同于简单的.format
调用。因此,它是li例如.format调用,但它会自动转义它需要的字符?@Everyone\u其他人如我所说,我不是Python编码器。参数化查询的实际实现可以使用不同的方法,从真正的服务器端绑定参数到客户端模拟。