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