2011-06-08 1 views
2

J'ai essayé de le faire dans l'interprète et je peux le faire fonctionner mais dans ma fonction, il ne le fait pasPourquoi pas ce travail (sqlite, python)

Ce que je suis en train de faire:

cursor = dbconnect.cursor() 
cursor.execute("""SELECT * FROM credits WHERE phone = ?""",(phone,)) 
data = cursor.fetchone() 
firstname = data[1] #the db is set as firstname in position 1 after the id(primekey) 

J'extraction en fait toutes les données en utilisant cette méthode juste avec différentes variables

l'erreur que je reçois quand je le fais dans la fonction:

firstname = data[1] 
TypeError: 'NoneType' object is not subscriptable 

Comme une note: Je mets une déclaration d'impression après l'objet de données pour voir ce qu'il rentrait, dans l'interprète, il retourne le tuple Je cherche, dans la fonction, il est de retour « None »

CODE COMPLET :

def FindByPhone(self,phone): 
    '''Find Credit by phone number ONLY'''  
    dbconnect = sqlite3.connect(self.dbname) 
    cursor = dbconnect.cursor() 
    cursor.execute("""SELECT * FROM credits WHERE phone = ?""",(phone,)) 
    data = cursor.fetchone() 
    first = data[1] 
    last = data[2] 
    phone = data[3] 
    credit = data[4] 
    cid = data[0] 
    self.SetVariables(first,last,phone,credit,cid) 
    cursor.close() 
    dbconnect.close() 
    return 

Répondre

2

Je pense que le problème est que votre fonction ne vérifie pas s'il y avait une ligne correspondante dans la base de données. vous obtiendrez cette erreur si aucune ligne est retourné:

#!/usr/bin/python 
try: 
    import sqlite3 
except: 
    from pysqlite2 import dbapi2 as sqlite3 

#prepare testcase  
db="/tmp/soverflow.sqlite" 
dbconnect = sqlite3.connect(db) 
c = dbconnect.cursor() 
c.execute("""create table credits 
(id int not null primary key, firstname varchar(50), phone varchar(30),amount int not null)""") 
c.execute("""INSERT INTO credits (id,firstname,phone,amount) VALUES (1,'guybrush','123-456',24)""") 
c.execute("""INSERT INTO credits (id,firstname, phone,amount) VALUES (2,'elaine','1337-1337',18)""") 
dbconnect.commit() 
c.close() 


def print_firstname(phone): 
    cursor = dbconnect.cursor() 
    cursor.execute("""SELECT * FROM credits WHERE phone = ?""",(phone,)) 
    data = cursor.fetchone() 
    firstname = data[1] 
    cursor.close() # cleanup 
    print firstname 

print "testing existing row" 
print_firstname('1337-1337') 

print "testing missing row" 
print_firstname('nothere') 

=>

./soverflow_sqlite.py 
testing existing row 
elaine 
testing missing row 
Traceback (most recent call last): 
    File "./soverflow_sqlite.py", line 31, in <module> 
    print_firstname('not-in-db') 
    File "./soverflow_sqlite.py", line 23, in print_firstname 
    firstname = data[1] 
TypeError: 'NoneType' object is not subscriptable 

Solution: Ajouter un chèque s'il y avait une ligne renvoyée de votre requête

+0

Je viens d'ajouter la code réel im essayant de fonctionner dans mon message original – Isov5

+0

comment exactement appelez-vous votre fonction? peut-être que la valeur du téléphone lui-même est None ou une valeur qui n'existe pas dans la base de données? – Gryphius

+0

Eh bien, je l'appelle à partir de l'interface graphique wx.TextCtrl que je mets à une variable ... quelque chose comme téléphone = wx.TextCtrl.GetValue() – Isov5

Questions connexes