2008-11-25 14 views
5

Aşağıdaki satırın tam olarak ne anlama geldiğini bulmaya çalışıyorum - özellikle %% s bölümü?Newbie Python parametreli dizgilerle ilgili soruyu soruyor: "%% s"?

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

Dize biçimlendirmesi ve Python ile dizelere değişkenler eklenmesiyle ilgili iyi bir mini öğretici?

+0

Bu, kokmuş bir kod parçası. Bunu nereden buldun? Bu kaçınmak istediğim bir şey. –

+0

trac için mastertickets eklentisi – Epaga

+0

oh ve meraktan ... çok okunabilir olmadığını (bu yüzden soru;) kabul ediyorum, ama bunun yerine nasıl yapmalı? – Epaga

cevap

6

dönüşür. Bu kod aslında iki düzey dize biçimlendirmesi yapıyor.

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

sonra db tabakası bırakılır yuvaları parametreleri geçerlidir: İlk %sourcedest içine esasen kodunuzu açmak için çalıştırılır.

Db'nin yuvalarının ilk dize biçimlendirme işleminden güvenli bir şekilde geçmesini sağlamak için çift% 'i gerekir.

4

"Ancak bunun yerine nasıl yapmalı?"

Zorlu arama. Sorun metadata (özellikle sütun isimleri) bir SQL deyimine tıkanmalarıdır. Bu tür şeylerin büyük bir hayranı değilim. sourcedest değişkeninin güncellenecek iki sütun adı vardır.

Oranlar, aslında kullanılan yalnızca bir (veya birkaç tane) çift sütun adının olması iyidir. Benim tercihim bunu yapmak.

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

şey bu tür sütunların birden fazla geçerli kombinasyon var, bu veri modeli ortak bir veritabanı tasarımı sorundur tek bir tablo, içine iki varlık birleştirilecek gösterir. Bir ürünle ve eklentiyle çalıştığınız için, veri modeli sorunları hakkında yapabileceğiniz fazla bir şey yok.

3

Dize biçimlendirmesi kullanılarak eklenen sütun adlarının olması, kullanıcı tarafından sağlanmadıkları sürece çok da kötü değildir.

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

Aynı yapar:

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

bunu asla değerler olsa sorgu parametreleri olmalıdır.

+0

Merak etme. yapmam. o_O – Epaga