2016-04-10 14 views
-1

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

Antwort

0

Sie übergeben Ihre Formatparameter nicht korrekt. Betrachten Sie zum Beispiel eine der folgenden Zeilen:

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

Sie haben andere Fehler für ähnliche Zeilen.

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

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

Verwandte Themen