2011-09-14 24 views
0

我寫了下面的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由於某種原因不能移動到最新的versionof蟒蛇,我使用python version 2.5.2,那麼什麼是在這種環境下最好的解決辦法?

+0

要非常小心,要在該字符串變量AREN沒有對用戶提交的內容進行unsanitized;這有SQL注入寫在它。 – geoffspear

回答

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} 
+0

這真是一個很好的答案,你救了我,謝謝你。 –

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

+0

感謝您的回覆,我已編輯我的帖子,請再次閱讀,我使用舊的Python版本。 –

+0

@AamirAdnan:好吧,你已經得到了三次這個案例的答案...... :) – dancek

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 
+0

謝謝你的回答。 –

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