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

  • Canceriansoul

    Canceriansou

    15 Ocak 2011
  • hockeywebcasts

    hockeywebcas

    31 EKİM 2012
  • Simon Hayter

    Simon Hayter

    20 HAZİRAN 2010