Python 格式化字符串的有效方法

Python 格式化字符串的有效方法,python,string,formatting,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] “选择someTableName.somefield,从someT

我正在编写以下sql查询:

"select someTableName.somefield, count(*) from someTableName WHERE someTableName.TimeStamp > %s and someTableName.EndTimeStamp < %s group by someTableName.ProviderUsername;", [from_date, to_data]
“选择someTableName.somefield,从someTableName中计数(*),其中someTableName.TimeStamp>%s和someTableName.EndTimeStamp<%s按someTableName.ProviderUsername;分组,”,[从\u日期到\u数据]
这个查询可以在三个表上使用,所以我不想修改表名,所以我所做的就是这样

"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]
“从%s中选择%s.somefield,count(*),其中%s.TimeStamp>%s和%s.EndTimeStamp<%s按%s.ProviderUsername;分组,[tableName,tableName,tableName,from_date,tableName,to_data,tableName]
正如您在上面的查询中所看到的,我必须多次使用
tableName
,因此我需要为每种情况提供
tableName
,有什么最好的方法来实现这一点吗

已编辑


我没有
python 2.6
来使用
str.format
,并且由于某些原因无法移动到python的最新版本,我使用的是
python 2.5.2版
,那么在这种环境下,什么是最好的解决方案呢?

如果您至少有python 2.6,您可以使用:

s=“选择{0}.somefield,从{0}其中{0}.TimeStamp>{1}和{0}.EndTimeStamp<{2}按{0}.ProviderUsername分组计数(*)”
query=s.format(表名、fromDate、toDate)
这样,您可以在字符串中多次使用同一变量


还要注意的是,您可以在字符串格式中使用命名变量,如下所示:

"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}
“选择%(tableName)s.somefield,count(*)from%(tableName)s其中%(tableName)s.TimeStamp>%(fromDate)s和%(tableName)s.EndTimeStamp<%(to_data)s groupby%(tableName)s.ProviderUsername;“%{tableName':tableName,'fromDate':fromDate',to_data':to_data}”

你可以用字典代替

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
mydict={'table':随便什么,'startdate':yourstartdate,'enddate':yourenddate}
sql=“选择%(表)s.somefield,从%(表)s中计数(*),其中%(表)s.TimeStamp>%(startdate)s和%(表)s.EndTimeStamp<%(enddate)s group by%(表)s.ProviderUsername;%mydict
template=“选择%(tableName)s.somefield,从%(tableName)s中计算(*),其中%(tableName)s.TimeStamp>%(fromDate)s和%(tableName)s.EndTimeStamp<%(to_data)s group by%(tableName)s.ProviderUsername;”
query=模板%locals()

感谢您的回复,我已经编辑了我的帖子,请重新阅读,我使用的是旧的python版本。@AamirAdnan:好吧,您已经三次得到了这个问题的答案了……:)要非常小心,进入该字符串的变量不是未初始化的用户提交的内容;这上面写满了SQL注入。
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
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()