MySQL Python中的替换文字准备语句

时间:2017-09-14 17:07:42

标签: prepared-statement mysql-python

我是MySQL Python连接器的新手,我试图找出在预备语句中我是否可以替换非参数?这是我需要在递减计数器时重复执行的查询示例:

UPDATE
        material_forecast_series sfs
    JOIN material_forecast sf ON sfs.F_ID = sf.F_ID
    JOIN material_demand sd ON sd.date_ID = sf.date_ID
        AND sd.D_ID = sfs.D_ID
    JOIN material_demand_series ds ON sfs.D_ID = ds.D_ID
    JOIN OMG_membership om ON ds.item_ID = om.item_ID
    JOIN material_FE sfe ON sfe.F_ID = sf.F_ID
SET sfe.v2 = IF(sf.v2 = 0, NULL, (sd.quantity - sf.v2) / sf.v2)
    WHERE
        sfs.forecast_ID = 15
            AND ds.demand_ID = 9
            AND ds.O_ID = 2
            AND om.OG_ID = 318
            AND sd.date_ID = 275
            AND sfe.date_ID = 274

在上面的代码段中,最后一个参数sfe.date_ID将在循环中递减。没问题,我会做sfe.date_ID=%s。但是在这一行中:SET sfe.v2 = IF(sf.v2 = 0, NULL, (sd.quantity - sf.v2) / sf.v2)文字v2需要在每次循环迭代时更改为v3, v4, v5...。没问题,如果我要使用Python参数替换和常规游标,但我想使用预处理语句的性能原因。 任何其他提高性能的技巧都非常受欢迎

2 个答案:

答案 0 :(得分:0)

如何创建一个DynamicSQL,在你的循环中做这样的事情,变量up_counter最终会增加

git mv someName.txt NameOfFolder/someName.txt

答案 1 :(得分:0)

抱歉,这是不可能的。引用the documentation of PREPARE(强调“数据值”是我的):

  

语句名称不区分大小写。 preparable_stmt 是字符串文字或包含SQL语句文本的用户变量。文本必须表示单个语句,而不是多个语句。在语句中,?个字符可用作参数标记,以指示稍后在执行时将数据值绑定到查询的位置。 ?字符不应括在引号内,即使您打算将它们绑定到字符串值也是如此。参数标记只能在数据值出现的地方使用,而不能用于SQL关键字,标识符等。

由于v2v3等字段名称在语法上不是数据值而是标识符,因此您无法使用预准备语句将其替换为占位符。