SORU
23 EKİM 2008, PERŞEMBE


SQLite parametre değiştirme sorunu

2.5, ben Python ile SQLite3 kullanarak bir liste boyunca yineleme ve veritabanı öğenin adına göre bir maddenin ağırlığı çekmeye çalışıyorum.

Bu kullanarak denedim "?" parametre değiştirme SQL enjeksiyonları önlemek için önerdi ama işe yaramıyor. Kullandığımda örneğin,:

for item in self.inventory_names:
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
    self.cursor.close()

Hata alıyorum:

sqlite3.ProgrammingError: bağlamaları verilen numara Yanlış. Geçerli deyimi 1 ve 8 sağlanan vardır kullanır.

Bu şekilde veritabanı ilk oluşturulmasından kaynaklanır inanıyorum; bu yaptığım modül aslında DB 8 bağlamaları var mı oluşturur.

cursor.execute("""CREATE TABLE Equipment 
    (id INTEGER PRIMARY KEY, 
    name TEXT,
    price INTEGER, 
    weight REAL, 
    info TEXT, 
    ammo_cap INTEGER, 
    availability_west TEXT,
    availability_east TEXT)""")

Kullandığımda ancak, daha az güvenli "%s" işler her öğe adı yerine, gayet iyi. Bunun gibi

for item in self.inventory_names:
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item)
    self.cursor.close()

Tek arıyorum 8 bindins var sanıyor neden olduğunu çözemedim. Bunu nasıl düzeltebilirim?

CEVAP
23 EKİM 2008, PERŞEMBE


Cursor.execute() metodu ikinci parametre olarak bir dizi bekliyor. 8 karakter uzunluğunda olan bir dize besliyorsunuz.

Aşağıdaki formu kullanın:

self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])

Python kütüphane referansı 13.13.3:* *9 sqlite3.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BroadCity

    BroadCity

    10 ŞUBAT 2010
  • merumputdotcom

    merumputdotc

    24 ŞUBAT 2012
  • TV nEW

    TV nEW

    25 AĞUSTOS 2012