Python 创建一个动态sql查询,其中根据给定的参数生成一个条件

Python 创建一个动态sql查询,其中根据给定的参数生成一个条件,python,dynamic-sql,Python,Dynamic Sql,我使用下面的SQL查询根据包含年份和月份的month_id获取数据: sql_hours = str("""select * from monthly_hours where month_id IN \ (201701,201702,201703,201704,201705,201706,201707,201708,201709,201710,201711,201712) and class = 'Optimal';""") 基本表如下所示

我使用下面的SQL查询根据包含年份和月份的month_id获取数据:

sql_hours = str("""select * from monthly_hours where month_id IN  \
                          (201701,201702,201703,201704,201705,201706,201707,201708,201709,201710,201711,201712) and class = 'Optimal';""")
基本表如下所示:

device_id   month_id    group   hours   tier
53          201705      TX      11.31   Optimal
28          201701      WS      31.56   Sub - Optimal
32          201706      WX      2.93    Optimal
57          201709      TS      2.68    Optimal 
28          201702      OE      0.70    Optimal
根据用户希望获取的月份数和当前月份的数据,中的值将发生变化。 例如,当前月份\u id为201802,如果没有\u of \u months=6,我的查询将变成:

sql_hours = str("""select * from monthly_hours where month_id IN  \
                          (201707,201708,201709,201710,201711,201712) and class = 'Optimal';""")
数据滞后2个月,因此2月份当月的最新数据为201712。然而,3月份的最新数据为201801。因此,月份id必须在201707和201712之间。 如果月号=12,则月号必须在201701和201712之间


有人能帮我吗?我不知道如何在python中完成如此多的sql查询参数化

您可以使用变量更新查询字符串,使用.format参数化,例如:

dates = '201707,201708,201709,201710,201711,201712'

sql_hours = str("select * from monthly_hours where month_id IN  \
                          ({}) and class = 'Optimal';".format(dates))

只有当您101%确定变量来自您自己的代码,而不是来自任何外部用户、文件、请求或任何输入时,才能执行此操作-除非您不介意打开应用程序进行SQL注入当然,我很抱歉,但我无法确切了解您的问题是什么?根据指定的月数为IN子句选择月数。因此,如果月数为6,从2018年2月的当前日期到2017年9月,将是用于过滤月id的月份列表。那么它与SQL有什么关系?您只需要生成一个YYYYMM字符串列表提示:您需要这里的字符串,如果您使用的是整数,那么这是错误的,这些是数字代码,但不是从一个YYYYMM开始并返回N个月的整数。这里没有什么神奇或过于复杂的东西,关于这种日期操纵已经有很多问题了,例如cf