在 MySQL Python 准备语句中替换文字
Substitute literals in MySQL Python prepared statement
我是 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 参数替换和常规游标没问题,但出于性能原因我想使用准备好的语句。
也非常感谢任何其他提高性能的技巧
如何创建一个 DynamicSQL ,在你的循环中做这样的事情,变量 up_counter 最后递增
set @up_counter = 1
set @dynamic_sql_1 = '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.v'
set @dynamic_sql_2 = CONCAT(@up_counter,' = IF(sf.v',',@up_counter,' = 0, NULL, (sd.quantity - sf.v',@up_counter,') / sf.v',@up_counter,')')
Set @dynamic_sql_2 = ' 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 = %s '
Set @final_sql = CONCAT(@dynamic_sql_1,@dynamic_sql_2,@dynamic_sql_2)
PREPARE stmt1 FROM @final_sql;
EXECUTE stmt1 ;
DEALLOCATE PREPARE stmt1;
set @up_counter = @up_counter + 1
抱歉,这不可能。引用 the documentation of PREPARE
(强调“数据值”是我的):
Statement names are not case sensitive. preparable_stmt
is either a string literal or a user variable that contains the text of the SQL statement. The text must represent a single statement, not multiple statements. Within the statement, ?
characters can be used as parameter markers to indicate where data values are to be bound to the query later when you execute it. The ?
characters should not be enclosed within quotation marks, even if you intend to bind them to string values. Parameter markers can be used only where data values should appear, not for SQL keywords, identifiers, and so forth.
由于 v2
和 v3
等字段名称在语法上不是数据值而是标识符,因此您不能使用准备好的语句将它们替换为占位符。
我是 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 参数替换和常规游标没问题,但出于性能原因我想使用准备好的语句。
也非常感谢任何其他提高性能的技巧
如何创建一个 DynamicSQL ,在你的循环中做这样的事情,变量 up_counter 最后递增
set @up_counter = 1
set @dynamic_sql_1 = '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.v'
set @dynamic_sql_2 = CONCAT(@up_counter,' = IF(sf.v',',@up_counter,' = 0, NULL, (sd.quantity - sf.v',@up_counter,') / sf.v',@up_counter,')')
Set @dynamic_sql_2 = ' 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 = %s '
Set @final_sql = CONCAT(@dynamic_sql_1,@dynamic_sql_2,@dynamic_sql_2)
PREPARE stmt1 FROM @final_sql;
EXECUTE stmt1 ;
DEALLOCATE PREPARE stmt1;
set @up_counter = @up_counter + 1
抱歉,这不可能。引用 the documentation of PREPARE
(强调“数据值”是我的):
Statement names are not case sensitive.
preparable_stmt
is either a string literal or a user variable that contains the text of the SQL statement. The text must represent a single statement, not multiple statements. Within the statement,?
characters can be used as parameter markers to indicate where data values are to be bound to the query later when you execute it. The?
characters should not be enclosed within quotation marks, even if you intend to bind them to string values. Parameter markers can be used only where data values should appear, not for SQL keywords, identifiers, and so forth.
由于 v2
和 v3
等字段名称在语法上不是数据值而是标识符,因此您不能使用准备好的语句将它们替换为占位符。