Почему это не работает (sqlite, python) - PullRequest
2 голосов
/ 08 июня 2011

Я пытался сделать это в интерпретаторе, и я могу заставить его работать, но внутри моей функции это не

Что я пытаюсь сделать:

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)

Я на самом деле извлекаю все данные, используя этот метод только с разными переменными

Ошибка, которую я получаю, когда делаю это внутри функции:

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

Как примечание: я помещаю оператор печати после объекта данных, чтобы увидеть, что он возвращает, в интерпретаторе он возвращает кортеж, который я ищу, внутри возвращаемой функции 'None'

ПОЛНЫЙ КОД:

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

1 Ответ

2 голосов
/ 08 июня 2011

Я думаю, проблема в том, что ваша функция не проверяет, была ли соответствующая строка в базе данных. Вы получите эту ошибку, если строка не возвращается:

#!/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

Решение: Добавьте проверку, если по вашему запросу была возвращена строка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...