【问题标题】:how to pass multiple cli arguments to retrive months in SQL如何传递多个 cli 参数以在 SQL 中检索月份
【发布时间】:2020-09-19 18:46:01
【问题描述】:

我有一个每月净销售额数据的样本表

Region          Area            HQ         Month          Sales
 AAA            xyz             Ax          03            10000
 BBB            klm             Bk          03            20000
 AAA            xyz             Ax          04            23000
 BBB            klm             Bk          04            70000 
 BBB            klm             Bk          05            78000

我只需要特定月份的数据,因为我做了(在 python 中执行)

month_value = '';
if sys.argv[1:]:
      month_value = sys.argv[1]

query = """select * from sales_data where Month = '%s'""" %(month_value)

所以我将月份值作为 cli 参数传递。示例:python file_name.py 03

我明白了

Region          Area            HQ         Month          Sales
 AAA            xyz             Ax          03            10000
 BBB            klm             Bk          03            20000

有没有办法为不同的月份值传递多个参数以获得超过一个月的数据? (应该工作1个月和1个月以上)

例如:python file_name.py 03 04

我需要得到

Region          Area            HQ         Month          Sales
 AAA            xyz             Ax          03            10000
 BBB            klm             Bk          03            20000
 AAA            xyz             Ax          04            23000
 BBB            klm             Bk          04            70000

你能帮我解决这个问题吗?

提前致谢!

【问题讨论】:

    标签: python mysql sql


    【解决方案1】:

    如果我得到您的要求,我认为以下代码可以解决您的问题:

    month_value = sys.argv[1:]
    query = "select * from sales_data where Month IN("
    
    for month in month_value:
      query += "'%s'," %month
    query = query[:-1] + ")"
    

    我假设您将有一个列表,其中包含您要分析的所有月份的数字(也可以使用字符串更改列表中的值)。
    最后一行代码query = query[:-1] + ")" 删除了最后一个不必要的逗号并添加了右括号。

    【讨论】:

    • 你能告诉我如何将month_value作为cli agruments传递吗? @乔瓦尼
    • 你好,其实你很接近自己用sys.argv[1:]来做,实际上它返回一个所有参数的列表(不包括程序名sys.argv[0])。因此,您可以将其分配给month_value 变量:month_value = sys.argv[1:]。我还假设您唯一的 cli 参数是月份,如果不清楚的话。
    【解决方案2】:

    首先,您使用的是较旧的de-emphasized (not deprecated yet) 字符串格式化方式。当前方法是使用str.format (Python 2.6+) 或更新的F-string (Python 3.6+)。

    # NOT RECOMMENDED
    query = """SELECT * FROM sales_data WHERE `Month` = '%s'""" %(month_value)
    
    # str.format
    query = """SELECT * FROM sales_data WHERE `Month` = {}""".format(month_value)
    
    # f-string
    query = f"""SELECT * FROM sales_data WHERE `Month` = {month_value}"""
    

    其次,对于 SQL 查询,尤其是使用来自用户的命令行参数的查询,不要使用字符串格式查询,而是使用 parameterization 在其中创建带有占位符的准备好的语句,然后在随后的 cursor.execute 调用中绑定参数值。不要将参数化中使用的不带引号的%s 与您使用的过时字符串模方法中使用的带引号的'%s' 符号混淆。

    query = """select * from sales_data where Month = %s"""
    
    cursor.execute(query, [month_value])
    

    因此,要检索月份值列表,请使用占位符动态构建准备好的语句,然后将列表传递给执行调用。不要将下面的格式与我上面的谨慎混淆。下面为占位符的动态数量格式化准备好的语句,并在下一步绑定值。

    脚本

    month_vals = sys.argv[1:]
    
    prms = ", ".join(["%s" for _ in month_vals])
    query = """SELECT * FROM sales_data WHERE `Month` IN ({})""".format(prms)
    
    cursor.execute(query, month_vals)
    

    CLI

    $ python file_name.py 03 06 09
    

    【讨论】:

      猜你喜欢
      • 2020-12-04
      • 2015-03-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2013-11-21
      相关资源
      最近更新 更多