我正在编写以下sql查询:
"select someTableName.somefield, count(*) from someTableName WHERE someTableName.TimeStamp > %s and someTableName.EndTimeStamp < %s group by someTableName.ProviderUsername;", [from_date, to_data]
这个查询可以在三个表上使用,所以我不想修复表名,所以我正在做的就是这样。
"select %s.somefield, count(*) from %s WHERE %s.TimeStamp > %s and %s.EndTimeStamp < %s group by %s.ProviderUsername;", [tableName, tableName, tableName, from_date, tableName, to_data, tableName]
正如您在上面的查询中所看到的,我必须多次使用tableName
所以我需要为每次出现提供tableName
,有没有最好的方法来实现这一目标?
被修改
我没有python 2.6
使用str.format
由于某种原因无法移动到最新版本的python,我正在使用python version 2.5.2
,那么这个环境中最好的解决方案是什么?
答案 0 :(得分:5)
您可以在字符串格式中使用命名变量,如下所示:
"select %(tableName)s.somefield, count(*) from %(tableName)s WHERE %(tableName)s.TimeStamp > %(fromDate)s and %(tableName)s.EndTimeStamp < %(to_data)s group by %(tableName)s.ProviderUsername;" %{'tableName':tableName, 'fromDate':fromDate, 'to_data':to_data}
答案 1 :(得分:3)
如果您至少拥有Python 2.6,则可以使用str.format
:
s = "select {0}.somefield, count(*) from {0} WHERE {0}.TimeStamp > {1} and {0}.EndTimeStamp < {2} group by {0}.ProviderUsername;"
query = s.format(tableName, fromDate, toDate)
这样你就可以在字符串中多次使用相同的变量。
答案 2 :(得分:2)
您可以使用字典替换
mydict = {'table': whatever, 'startdate': yourstartdate, 'enddate': yourenddate}
sql = "select %(table)s.somefield, count(*) from %(table)s WHERE %(table)s.TimeStamp > %(startdate)s and %(table)s.EndTimeStamp < %(enddate)s group by %(table)s.ProviderUsername;" % mydict
答案 3 :(得分:0)
template = "select %(tableName)s.somefield, count(*) from %(tableName)s WHERE %(tableName)s.TimeStamp > %(fromDate)s and %(tableName)s.EndTimeStamp < %(to_data)s group by %(tableName)s.ProviderUsername;"
query = template % locals()