为什么 mysql 用户定义的变量在 python 中不起作用?
Why mysql user defined variable is not work in python?
我在 python 和 workbench 中有一个 SQL
运行,它们都 return 不同的结果。我认为主要原因是因为 @user defined variable
在我将它传递给 python mysql connector
时没有缓存,因此它无法执行计数功能。基本上,SQL
的逻辑是 运行k 每个超市(组)中的食物和 return 每个超市中的前 10 种食物(仅示例)。在 workbench 中,计数器将输出 1,2,3,4...
,而在 python 中,它们 return 1
不进行计数。我该如何预防?谢谢!
Code:
cnx= mysql.connector.connect(**config)
cursor = cnx.cursor()
query = f'''SELECT supermarket, food, counter
FROM (
SELECT supermarket, food,
@counter:=IF(@supermarket_id= supermarket, @counter+1,1) as counter,
@supermarket_id:= supermarket
FROM supermkt_data
order by supermarket, food) tmp
WHERE counter<= 10;
'''
log.info(query)
cursor.execute(query)
columns = [col[0] for col in cursor.description]
result = [dict(zip(columns, row)) for row in cursor.fetchall()]
您必须初始化变量。如果不是,那么它们将被视为在查询执行期间不会更改的常量。
query = f'''SELECT supermarket, food, counter
FROM ( SELECT supermarket, food,
@counter:=IF(@supermarket_id=supermarket,@counter+1,1) counter,
@supermarket_id:=supermarket
FROM supermkt_data
CROSS JOIN (SELECT @supermarket_id:=0, @counter:=0) init_vars
ORDER BY supermarket, food) tmp
WHERE counter <= 10;
'''
根据需要调整变量的起始值。
我在 python 和 workbench 中有一个 SQL
运行,它们都 return 不同的结果。我认为主要原因是因为 @user defined variable
在我将它传递给 python mysql connector
时没有缓存,因此它无法执行计数功能。基本上,SQL
的逻辑是 运行k 每个超市(组)中的食物和 return 每个超市中的前 10 种食物(仅示例)。在 workbench 中,计数器将输出 1,2,3,4...
,而在 python 中,它们 return 1
不进行计数。我该如何预防?谢谢!
Code:
cnx= mysql.connector.connect(**config)
cursor = cnx.cursor()
query = f'''SELECT supermarket, food, counter
FROM (
SELECT supermarket, food,
@counter:=IF(@supermarket_id= supermarket, @counter+1,1) as counter,
@supermarket_id:= supermarket
FROM supermkt_data
order by supermarket, food) tmp
WHERE counter<= 10;
'''
log.info(query)
cursor.execute(query)
columns = [col[0] for col in cursor.description]
result = [dict(zip(columns, row)) for row in cursor.fetchall()]
您必须初始化变量。如果不是,那么它们将被视为在查询执行期间不会更改的常量。
query = f'''SELECT supermarket, food, counter
FROM ( SELECT supermarket, food,
@counter:=IF(@supermarket_id=supermarket,@counter+1,1) counter,
@supermarket_id:=supermarket
FROM supermkt_data
CROSS JOIN (SELECT @supermarket_id:=0, @counter:=0) init_vars
ORDER BY supermarket, food) tmp
WHERE counter <= 10;
'''
根据需要调整变量的起始值。