Python MYSQL多语句执行问题

Python MYSQL多语句执行问题,python,mysql,sql,Python,Mysql,Sql,假设我有一个多进程Python MySql查询: self.calculateLeadTime = ("""SET @lastDate = (SELECT sessionDate FROM stock WHERE product = (%s) ORDER BY stocksessionID DESC LIMIT 1); SET @secondLastDate = (SELECT sessionDate FROM stock WHERE product = (%s) ORDER BY stoc

假设我有一个多进程Python MySql查询:

self.calculateLeadTime = ("""SET @lastDate = (SELECT sessionDate FROM stock 
WHERE product = (%s)
ORDER BY stocksessionID DESC LIMIT 1);

SET @secondLastDate = (SELECT sessionDate FROM stock WHERE product = (%s)
ORDER BY stocksessionID DESC LIMIT 1, 1);

SET @leadTime = (SELECT DATEDIFF(@lastDate, @secondLastDate));
SET @lastStockSessionID = (SELECT stocksessionID
FROM stock WHERE product = (%s) ORDER BY stocksessionID DESC LIMIT 1);

UPDATE stock SET leadTime = (@leadTime)
WHERE stocksessionID = @lastStockSessionID;""", (self.productID.get(), self.productID.get(), self.productID.get()))

self.query = self.cur.execute(self.calculateLeadTime, multi=True)
for self.cur in self.results:
     print('cursor:', self.cur)
     if self.cur.with_rows:
         print('result:', self.cur.fetchall())
self.cn.commit()
我可能会犯以下错误:

stmt=operation.encodeself.\u connection.python\u字符集 AttributeError:“tuple”对象没有属性“encode”


我已经阅读了MySql-Python文档,其中涉及通过Python执行多个SQL语句时的multi=True。但是,我的实现不起作用。有什么想法吗?

当前,您正在调用中传递一个元组作为第一个参数,而它在第一个参数中需要一个标量查询字符串,在第二个参数中需要一个元组/参数列表:

self.calculateLeadTime = """SET @lastDate = (SELECT sessionDate 
                                             FROM stock 
                                             WHERE product = (%s)
                                             ORDER BY stocksessionID DESC LIMIT 1);

                            SET @secondLastDate = (SELECT sessionDate 
                                                   FROM stock WHERE product = (%s)
                                                   ORDER BY stocksessionID DESC LIMIT 1, 1);

                            SET @leadTime = (SELECT DATEDIFF(@lastDate, @secondLastDate));
                            SET @lastStockSessionID = (SELECT stocksessionID
                                                       FROM stock WHERE product = (%s)
                                                       ORDER BY stocksessionID DESC LIMIT 1);

                            UPDATE stock 
                            SET leadTime = (@leadTime)
                            WHERE stocksessionID = @lastStockSessionID;
                         """

self.query = self.cur.execute(self.calculateLeadTime, 
                              params=(self.productID.get(), self.productID.get(), self.productID.get()),
                              multi=True)
顺便说一下,MySQL支持对单个语句执行JOIN in UPDATE语句。使用以下两个参数运行:

更新库存 内连接 选择产品,MAXstocksessionID作为MaxID 现货 其中产品=%s 按产品分组 agg_id 在s.stocksessionID=agg_id.MaxID上 内连接 选择产品,MAXsessionDate作为MaxDate 现货 按产品分组的最大值 关于max_dt.product=s.product 内连接 选择产品MAXsessionDate作为SecMaxDate 现货 其中sessionDate<选择MAXsessionDate 现货 其中产品=%s 按产品分组 秒最大值 关于max_dt.product=max_dt.product 设置前置时间=DATEDIFFMaxDate,SecMaxDate;
当前,您正在将元组作为调用中的第一个参数进行传递,而第一个参数需要单个标量查询字符串,第二个参数需要元组/参数列表:

self.calculateLeadTime = """SET @lastDate = (SELECT sessionDate 
                                             FROM stock 
                                             WHERE product = (%s)
                                             ORDER BY stocksessionID DESC LIMIT 1);

                            SET @secondLastDate = (SELECT sessionDate 
                                                   FROM stock WHERE product = (%s)
                                                   ORDER BY stocksessionID DESC LIMIT 1, 1);

                            SET @leadTime = (SELECT DATEDIFF(@lastDate, @secondLastDate));
                            SET @lastStockSessionID = (SELECT stocksessionID
                                                       FROM stock WHERE product = (%s)
                                                       ORDER BY stocksessionID DESC LIMIT 1);

                            UPDATE stock 
                            SET leadTime = (@leadTime)
                            WHERE stocksessionID = @lastStockSessionID;
                         """

self.query = self.cur.execute(self.calculateLeadTime, 
                              params=(self.productID.get(), self.productID.get(), self.productID.get()),
                              multi=True)
顺便说一下,MySQL支持对单个语句执行JOIN in UPDATE语句。使用以下两个参数运行:

更新库存 内连接 选择产品,MAXstocksessionID作为MaxID 现货 其中产品=%s 按产品分组 agg_id 在s.stocksessionID=agg_id.MaxID上 内连接 选择产品,MAXsessionDate作为MaxDate 现货 按产品分组的最大值 关于max_dt.product=s.product 内连接 选择产品MAXsessionDate作为SecMaxDate 现货 其中sessionDate<选择MAXsessionDate 现货 其中产品=%s 按产品分组 秒最大值 关于max_dt.product=max_dt.product 设置前置时间=DATEDIFFMaxDate,SecMaxDate;
我不确定这是否会起作用,或者甚至可以算作多个查询,因为Multi=true用于SELECTS中的多个结果集

您必须为%s添加数据

self.query = self.cur.execute(self.calculateLeadTime,('product','product','product') , multi=True)

我不确定这是否会起作用,或者甚至可以算作多个查询,因为Multi=true用于SELECTS中的多个结果集

您必须为%s添加数据

self.query = self.cur.execute(self.calculateLeadTime,('product','product','product') , multi=True)

我尝试了两种方法@Parfait已经提供了,但都没有效果。请详细说明Multi=True是否符合逻辑?谢谢。我认为你根本不需要它,所以试着不用它,但是添加数据作为tuplee,正如我在给你的答案中所显示的那样,这是有效的。有关multi-see的更多信息,请参阅我尝试了@Parfait提供的两种方法,但均无效。请详细说明Multi=True是否符合逻辑?谢谢。我认为你根本不需要它,所以试着不用它,但是添加数据作为tuplee,正如我在给你的答案中所显示的那样,这是有效的。如需有关multi的更多信息,请参阅“谢谢”。我已经尝试了这两种方法,但是在MySql浏览器中选择时,leadTime列不会显示所需的值。您认为这与mutli=True的使用有关吗?您是否仍然收到原始错误?不期望的结果可能是另一个SQL逻辑问题。如果没有库存表的样本数据,我们无法测试这两种解决方案。您如何知道所需的值?要进行调试,请检查单个子查询或@variables是否返回预期结果。检查偶数参数值。谢谢。我已经尝试了这两种方法,但是在MySql浏览器中选择时,leadTime列不会显示所需的值。您认为这与mutli=True的使用有关吗?您是否仍然收到原始错误?不期望的结果可能是另一个SQL逻辑问题。如果没有库存表的样本数据,我们无法测试这两种解决方案。您如何知道所需的值?要进行调试,请检查单个子查询或@variables是否返回预期结果。检查偶数参数值。