2016-04-10 24 views
-1

Bir veritabanındaki değerleri güncelleştiren bir işlev yazmaya çalışıyorum, ancak bana bir "tuple dizini aralık dışı" hatası veriyor. Ben sql deyiminde aynı miktarda yer tutucum var, bu da yine de aynı hatayı veriyor. Hata, 27 numaralı satırdaki updateValues ​​işlevindedir. Yardımı takdir edeceğim, python'a yeni bir program yapıyorum ve programlama yapmak, deneme yanılma yoluyla öğreniyorum.Tuple dizini aralık dışı veri tabanı

masa testi oluşturun: Bu çıkış ana()

:

import sqlite3 

class dbAccess(): 

def __init__(self, **kwargs): 
    self.filename = kwargs.get('filename') 
    self.table = kwargs.get('table', 'grocery') 

def sqlDo(self, sql, *params): 
    self._db.execute(sql, params) 
    self._db.commit() 

def insertValues(self, db, item, cost, quantity): 
    self._db.execute('INSERT INTO {} (NAME, COST, QUANTITY) VALUES(?, ?, ?)'.format(self._table), (item, cost, quantity)) 
    self._db.commit() 

def retrieveValues(self, ID): 
    cursor = self._db.execute('select * from {} where name = ?'.format(self._table), (ID,)) 
    return dict(cursor.fetchone()) 

def updateValues(self, quantity, ID): 
    self._db.execute('UPDATE {} SET QUANTITY = {} WHERE ID = {}'.format(self._table), (quantity, ID)) 
    self._db.commit() 

def delete(self, ID): 
    self._db.execute('delete from {} where t1 = ?'.format(self._table), (ID,)) 
    self._db.commit() 

def calculateCost(self): 
    cursor = self._db.execute('select name, cost * quantity from {}'.format(self._table)) 
    for v in cursor: 
     print(dict(v)) 

def __iter__(self): 
    cursor = self._db.execute('SELECT * FROM {} ORDER BY ID'.format(self._table)) 
    for row in cursor: 
     yield(dict(row)) 


@property 
def filename(self): return self._filename 

@filename.setter 
def filename(self, fn): 
    self._filename = fn 
    self._db = sqlite3.connect(fn) 
    self._db.row_factory = sqlite3.Row 

@filename.deleter 
def filename(self): 
    self._filename.close() 

@property 
def table(self): 
    return self._table 
@table.setter 
def table(self, t): 
    self._table = t 
@table.getter 
def table(self): 
    self._table = 'test' 

def close(self): 
    self._db.close() 
    del self._filename 


def main(): 
db = dbAccess(filename = 'test.db', table = 'test') 

print('Create table test') 
db.sqlDo('drop table if exists test') 
db.sqlDo('''CREATE TABLE IF NOT EXISTS test(
        ID INTEGER PRIMARY KEY AUTOINCREMENT, 
        NAME TEXT, 
        COST FLOAT, 
        QUANTITY INTEGER)''') 

print('Create rows') 
db.insertValues('test', 'test1', 4.99, 5) 
db.insertValues('test', 'test2', 7.99, 5) 
for row in db: print(row) 

print('Calculate Costs') 
print(db.calculateCost()) 

print('Retrieve rows') 
print(db.retrieveValues('test1'), db.retrieveValues('test2')) 

print('Update rows') 
db.updateValues(0, 1) 
for row in db: print(row) 

print('Delete rows') 
db.delete('1') 
for row in db: print(row) 

eğer adı == "ana":

Bu

sınıfın kodudur satırları oluşturun {'NAME': 'test1', 'QUANTITY': 5, 'ID': 1, 'COST': 4.99} {'NAME': 'test2', 'QUANTITY': 5, 'ID ': 2,' MALİYET ': 7.99} Hesaplama Maliyetleri {' maliyet * miktar ': 24.950000000000003,' NAME ':' test1 '} {' maliyet * miktar ': 39.95,' NAME ':' test2 '} Hiçbiri Satırları al {'NAME': 'test1', 'QUANTITY': 5, 'ID': 1, 'COST': 4.99} {'NAME': 'test2', 'QUANTITY': 5, 'ID' : 2, 'MALİYET': 7.99} Güncelleştirme satırları Geri izleme (en son çağrı son): Dosya "C: \ Users \ Wilfredo \ Documents \ Aptana Studio 3 çalışma alanı \ GroceryList \ Grocery \ dbAccess.py", satır 103, yılında adı == " ana" eğer: ana()
Dosya "C: \ Users \ Wilfredo \ Belgeler Aptana Studio \ 3 Çalışma Alanı \ GroceryList \ Grocery \ dbAccess.py ", satır 96, ana db.updateValues ​​(0, 1) Dosya" C: \ Kullanıcılar \ Wilfredo \ Belgeler \ Aptana Studio 3 Çalışma Alanı \ GroceryList \ Market \ dbAccess.py ", satır 27, updateValues ​​içinde self._db.execute ('UPDATE {} SET QUANTITY = {} WHERE ID = {}'. biçimi (self._table), (miktar, kimlik)) IndexError: tuple endeksi aralık

cevap

0

Biçim parametrelerinizi doğru şekilde iletmiyorsunuz. Örneğin, sorunlu satırlardan birine bakın:

Benzer çizgiler için başka hatalarınız da olacaktır.

Öyle gibi biçimlendirme edilmelidir: çözüldü

self._db.execute('UPDATE {} SET QUANTITY = {} WHERE ID = {}'.format(self._table, quantity, ID) 
+0

Sorun teşekkür ederim. Başka bir soru var, aynı şekilde biçimlendirilmiş diğer satırlar ama insertValues ​​işlevi gibi bir hata sunmadı, updateValues ​​işleviyle aynı şekilde yazılıyordu ama düzgün çalışıyordu. Çalışma zamanında çalıştığı insertValues ​​işlevinde farklı olan nedir? – wrivera24

İlgili konular