当前位置: 首页 > 知识库问答 >
问题:

python中多变量MySQL select

萧阳波
2023-03-14

我想使用以下类型的python脚本中的SELECT,包含2个变量:

  • 带有ID的列表
  • 计数

类似这样的事情:

SELECT * 
  FROM servers 
 WHERE id IN (32, 48, 49, 68) 
 GROUP 
    BY serial 
 ORDER 
    BY first_seen 
 LIMIT 4;

“in”中的ID的数量将会改变,“limit”也会根据服务的数量改变。(在本例中,我有4个服务器id,因此限制也是4个)

我尝试了以下(这是一种场景):

list_serial_client = (24,347,359,360,362,363,365,418,388,23)


my_string = ','.join(map(str, list_serial_client)) 
count = len(list_serial_client)

tuple = ((my_string), count)
print(tuple)

q="""SELECT \
i.id,s.serial, i.persistent_uuid, b.id, u.patchnum, u.first_seen \
FROM  installs i LEFT JOIN serials s ON  s.hardware_id = i.hardware_id \
LEFT JOIN updates u ON u.install_id = i.id \
LEFT JOIN buildnumbers b ON b.image_uuid = u.image_uuid \
WHERE s.serial IN (%s) \
AND i.invalidated IS NULL GROUP BY s.serial, u.first_seen \
ORDER BY first_seen DESC LIMIT %s"""

mycursor.execute(q, tuple)

for x in mycursor:
    print(" >>  " + str(x))

不幸的是,它仅使用第一个ID的行(本例中为24),并且忽略了限制

 >>  (44, 24, 'cdc9fd8d-6899-4d9c-89c3-3b71b2dd88c5', 144, 831)
 >>  (44, 24, 'cdc9fd8d-6899-4d9c-89c3-3b71b2dd88c5', 124, 448)
 >>  (44, 24, 'cdc9fd8d-6899-4d9c-89c3-3b71b2dd88c5', 106, 448)
 >>  (44, 24, 'cdc9fd8d-6899-4d9c-89c3-3b71b2dd88c5', 7, 448)

打印(元组)的输出如下:('24,347,359,360,362,363,365,418,388,23',10)

我想在in()部分中有“24,347,359,360,362,363,365,418,388,23”,而10在极限处

谢谢

共有1个答案

东方英豪
2023-03-14

您可以使用String.Format或f-strings,如下所示:

>>> q = 'SELECT * FROM servers WHERE id IN {} GROUP BY serial ORDER BY first_seen LIMIT {};'
>>> list_serial_client =  (32, 48, 49, 68) 
>>> limit = len(list_serial_client)
>>> mysql_query = q.format(list_serial_client, limit)
>>> mysql_query
'SELECT * FROM servers WHERE id IN (32, 48, 49, 68) GROUP BY serial ORDER BY first_seen LIMIT 4;'
>>> 
>>> 
>>> list_serial_client =  (32, 48, 49, 68) 
>>> limit = len(list_serial_client)
>>> mysql_query = f'SELECT * FROM servers WHERE id IN {list_serial_client} GROUP BY serial ORDER BY first_seen LIMIT {limit};'
>>> mysql_query
'SELECT * FROM servers WHERE id IN (32, 48, 49, 68) GROUP BY serial ORDER BY first_seen LIMIT 4;'
>>> 
 类似资料:
  • 1、变量的创建和赋值 在 Python 程序中,变量是用一个变量名表示,可以是任意数据类型,变量名必须是大小写英文、数字和下划线(_)的组合,且不能用数字开头,比如: a=88 这里的 a 就是一个变量,代表一个整数,注意一点是 Python 是不用声明数据类型的。在 Python 中 = 是赋值语句,跟其他的编程语言也是一样的,因为 Python 定义变量时不需要声明数据类型,因此可以把任意的

  • 问题内容: 第一个问题是Value和Manager()。Value有什么区别? 其次,是否可以不使用Value共享整数变量?下面是我的示例代码。我想要的是获取一个整数值而不是Value的字典。我所做的就是在此过程之后全部更改。有没有更简单的方法? 问题答案: 使用时,您会在共享内存中获得一个对象,默认情况下,该对象使用进行同步。使用该对象时,您将得到一个控制服务器进程的对象,该服务器进程允许对象值

  • 问题内容: 我有2个守护程序,它们应该访问相同的变量。我为全局变量创建了第3个文件,每个守护程序都可以访问该变量。但是,当一个更改变量时,另一个仍然看到默认值。 例: glob.py 守护程序a: 守护程序b: 每次我希望我将问题弄清楚时,它将打印0,并且有人可以帮助我。如果您需要更多信息,请随时询问。 问题答案: 看起来(尽管您没有明确告诉您)您正在以一种完全独立的方式运行程序:Python解释

  • 问题内容: 我有Python类,在运行时我只需要一个实例,因此每个类只具有一个属性就足够了,而每个实例只具有一次属性就足够了。如果将有多个实例(不会发生),则所有实例应具有相同的配置。我想知道以下哪种选择更好或更“惯用”的Python。 类变量: 实例变量: 问题答案: 我有Python类,在运行时我只需要一个实例,因此每个类只具有一个属性就足够了,而每个实例只具有一次属性就足够了。如果将有多个实

  • 问题内容: 为什么这项工作 但是扩充会导致语法错误。 我期待有另一种方式: 问题答案: 您不能在多个目标上使用增强分配语句。 引用扩充作业文档: 除了在单个语句中分配给元组和多个目标外, 由扩展赋值语句完成的赋值与普通赋值的处理方式相同。类似地,除了可能 的就地 行为外,通过扩充分配执行的二进制操作与正常的二进制操作相同。 强调我的。 就地扩展分配从转换为(每个操作员都有相应的钩子),并且不支持将

  • 问题内容: 为了计算多元法线的CDF,我遵循了此示例(对于单变量情况),但无法解释scipy产生的输出: 产生的输出是: 如果联合CDF定义为: 则预期输出应为0到1之间的实数。 问题答案: 经过大量搜索后,我认为Noah H. Silbert的这篇博客文章描述了标准库中唯一可用于在Python中为多元正态计算cdf的现成代码。Scipy可以做到这一点,但是正如博客中提到的那样,很难找到。该方法基