格式化字符串的有效方法

时间:2011-09-14 12:17:19

标签: python string formatting

我正在编写以下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,那么这个环境中最好的解决方案是什么?

4 个答案:

答案 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)

这样你就可以在字符串中多次使用相同的变量。

另请注意此is more future-proof than the old % formatting

答案 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()