2008-11-25 176 views
5

我想弄清楚下面這行是否完全是 - 特別是%% s部分?關於帶參數的字符串的新手Python問題:「%% s」?

cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (%%s, %%s)'%sourcedest, (self.tkt.id, n)) 

關於字符串格式化和插入變量到Python的字符串的任何好的迷你教程?

+0

這是一段很臭的代碼。你是在哪裏找到那個東西的。這是我想避免的。 – 2008-11-25 13:51:28

+0

mastertickets trac的插件 – Epaga 2008-11-25 14:02:02

回答

6

%%成爲單一%。這段代碼本質上是做兩個級別的字符串格式。首先%sourcedest執行把你的代碼基本上分爲:

cursor.execute('INSERT INTO mastertickets (BLAH, FOO) VALUES (%s, %s)', (self.tkt.id, n)) 

然後DB層應用參數,那剩下的插槽。

需要double-%才能安全地獲取通過第一個字符串格式化操作傳遞的數據庫的插槽。

4

「但是應該怎麼做呢?」

艱難的召喚。問題在於他們正在將元數據(特別是列名稱)即時插入到SQL語句中。我不是這種事情的忠實粉絲。變量sourcedest有兩個列名將被更新。

實際使用的列名稱對只有一對(或幾對)是很好的。我的首選是做到這一點。

if situation1: 
    stmt= "INSERT INTO mastertickets (this, that) VALUES (?, ?)" 
elif situation2: 
    stmt= "INSERT INTO mastertickets (foo, bar) VALUES (?, ?)" 
else: 
    raise Exception("Bad configuration -- with some explanation") 
cursor.execute(stmt, (self.tkt.id, n)) 

當有對這種事情列一個以上的有效組合,則表明該數據模型融合了兩個實體到一個單一的表,這是一種常見的數據庫設計問題。由於您使用的是產品和插件,因此您可以對數據模型問題做很多事情。

3

只要不是用戶提供的,使用字符串格式插入列名就沒有那麼糟。該值應該是查詢參數,但:

stmt = "INSERT INTO mastertickets (%s, %s) VALUES (?, ?)" % srcdest 
... 
cursor.execute(stmt, (self.tkt.id, n)) 
0

它確實是相同的:

cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (:%s, :%s)' % \ 
    tuple(sourcedest + sourcedest), dict(zip(sourcedest, (self.tkt.id, n)))) 

決不做。