Ich versuche, eine Funktion zu schreiben, die die Werte in einer Datenbank aktualisieren, aber es gibt mir einen Fehler "Tupel-Index außerhalb des Bereichs". Ich habe die gleiche Menge an Platzhaltern in der SQL-Anweisung, die im Tupel, aber es gibt mir immer noch den gleichen Fehler. Der Fehler ist in der updateValues Funktion in der Zeile 27. Ich werde die Hilfe schätzen, ich bin neu in Python und Programmierung per se und ich lerne durch Versuch und Irrtum.Tupel Index außerhalb des Bereichs Datenbank
Dies ist der Code der Klasse:
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)
wenn Name == "Haupt": main()
Dies ist der Ausgang:
erstellen Tabellentest Erstellen von Zeilen {'NAME': 'test1', 'MENGE': 5, 'ID': 1, 'KOSTEN': 4.99} {'NAME': 'test2', 'QUANTITÄT': 5, 'ID ': 2,' COST ': 7.99} Kosten berechnen {' Kosten * Menge ': 24.950000000000003,' NAME ':' Test1 '} {' Kosten * Menge ': 39.95,' NAME ':' Test2 '} Keine Zeilen abrufen {'NAME': 'test1', 'MENGE': 5, 'ID': 1, 'KOSTEN': 4.99} {'NAME': 'test2', 'MENGE': 5, 'ID' : 2, 'COST': 7.99} Zeilen aktualisieren Traceback (letzter Anruf zuletzt): Datei "C: \ Users \ Wilfredo \ Dokumente \ Aptana Studio 3 Workspace \ GroceryList \ Grocery \ dbAccess.py", Zeile 103, in wenn Name == "Haupt": main()
Datei "C: \ Benutzer \ Wilfredo \ Dokumente \ Aptana Studio 3 Arbeitsbereich \ GroceryList \ Grocery \ dbAccess.py ", Zeile 96, in Hauptverzeichnis db.updateValues (0, 1) Datei" C: \ Benutzer \ Wilfredo \ Dokumente \ Aptana Studio 3 Arbeitsbereich \ GroceryList \ Grocery \ dbAccess.py ", Zeile 27, in updateValues self._db.execute ('UPDATE {} SET MENGE = {} WHERE ID = {}'. Format (self._table), (Menge, ID)) IndexError: Tupelindex aus Bereich
Problem Ihnen danken:
sollten Sie mögen so werden die Formatierung. Ich habe eine andere Frage, die anderen Zeilen wurden auf die gleiche Weise formatiert, aber sie zeigten keinen Fehler wie die Funktion insertValues ist in der gleichen Weise wie die Funktion updateValues geschrieben, aber es funktionierte ordnungsgemäß. Was unterscheidet die Funktion insertValues von der Laufzeit? – wrivera24