【问题标题】:Python: Use JSON list as parameters in SQLPython:在 SQL 中使用 JSON 列表作为参数
【发布时间】:2015-07-08 11:55:55
【问题描述】:
res_vod = db.execute(""" 
SELECT CAST ((SUM(r.SalesVolume)/1000.0) AS decimal(6,1))
FROM RawData r
INNER JOIN Product p 
ON r.ProductId = p.ProductId 
INNER JOIN Calendar c 
ON r.DayId = c.DayId
WHERE c.WeekCodeInYear BETWEEN 30 AND 50
AND p.VODEST IN ('VOD')
AND p.Distributor IN ({})
GROUP BY c.WeekCodeInYear 
ORDER BY c.WeekCodeInYear""".format(', '.join(["'" + studio + "'" for studio in _studios]))  )

上面的代码允许我添加一个列表作为查询的参数。但是我的要求是添加多个参数。 上面代码中_studios是包含参数的列表。

_studios = ["WARNER","TF1","GAUMONT","PATHE","STUDIOCANAL","FRANCETV","M6SND"]

我还有另一个列表,例如: _vodest = ["VOD","EST"] 我想将此作为p.VODEST 的参数添加到查询中。

我可以通过使用% 轻松完成此操作,但必须注意该列表包含双引号("WARNER"),但 SQL 查询需要单引号('WARNER')

【问题讨论】:

标签: python sql-server json


【解决方案1】:

Always use parametrized sql 尽可能:

def placemarks(n):
    return ','.join(['%s']*n)

sql = """SELECT CAST ((SUM(r.SalesVolume)/1000.0) AS decimal(6,1))
         FROM RawData r
         INNER JOIN Product p 
         ON r.ProductId = p.ProductId 
         INNER JOIN Calendar c 
         ON r.DayId = c.DayId
         WHERE c.WeekCodeInYear BETWEEN 30 AND 50
         AND p.VODEST IN ({})
         AND p.Distributor IN ({})
         GROUP BY c.WeekCodeInYear 
         ORDER BY c.WeekCodeInYear""".format(
             placemarks(len(_vodest)), 
             placemarks(len(_studios)))
args = [_vodest + _studios]
res_vod = db.execute(sql, args)

【讨论】:

  • 这是一种更清洁、更有效的方法。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 2013-05-11
  • 2011-06-26
  • 2020-07-13
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多