Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 用';%参数化的SQL查询是什么s';看起来像_Python_Mysql_Sql - Fatal编程技术网

Python 用';%参数化的SQL查询是什么s';看起来像

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))) 当我

考虑表单中的特定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)))
当我运行此命令时,我会收到一条毫无帮助的错误消息“您的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编码器。参数化查询的实际实现可以使用不同的方法,从真正的服务器端绑定参数到客户端模拟。