Python sqlite3 оператор select from возвращает пустой список при получении - PullRequest
1 голос
/ 29 февраля 2012

Я пишу программу на pygtk с sqlite в качестве базы данных, я успешно создал базу данных с одной таблицей и шестью столбцами, используя:

cur.execute('''CREATE TABLE IF NOT EXISTS tabl (
                 Id INTEGER PRIMARY KEY, Name TEXT, Condition TEXT, Medicine TEXT, 
                 Age TEXT, Date DATE)''')

Я вставляю в него значения, используя:

    def save(Name, Age, Condition, Medicine):
       T = [(Name).title(),(Age).title(),(Condition).title(),(Medicine).title()]
       conn = sqlite3.connect('patients.db')
       cur = conn.cursor()
       conn.text_factory = str
       cur.execute('INSERT INTO tabl (Name,Condition,Medicine, Age,Date) VALUES (?,?,?,?,date("now"))',(T))

Значения предоставляются графическим интерфейсом.

Теперь у меня есть поле со списком в диалоге поиска, которое я буду использовать, чтобы указать, какой тип поиска (имя, возраст, дата или условие), поэтому я использовал для этого индекс выбранного элемента, это основной модуль. :

    def find(self,widget):
            index = self.comboBy.get_active()
            nameU = self.entryFor.get_text()
            name = nameU.title()
            names = database.findItem(name,index)

и вот база данных. FindItem:

    namen = name.title()
    if index == 0:
            print index
            cur.execute("SELECT * FROM tabl WHERE Name=?",[namen])
    elif index == 1:
            print index
            cur.execute("SELECT * FROM tabl WHERE Age=?",[namen])
    elif index == 2:
            print index
            cur.execute("SELECT * FROM tabl WHERE Date=?",[namen])
    else:
            print index
            cur.execute("SELECT * FROM tabl WHERE Condition=?",[namen])
    list = cur.fetchall()
    print list
    return list

, который работает только при указании имени, печатает индекс 0 и получает правильный список, но при попытке с другим столбцом, таким как условие, он возвращает пустой список [], хотя он печатает правильный индекс и видит правильный столбец, я запутался, пожалуйста, помогите.

1 Ответ

1 голос
/ 29 февраля 2012

РЕДАКТИРОВАТЬ: отредактированы неверные сведения об использовании cursor.execute().

Вы пытались выполнить SQL-запрос к базе данных напрямую (без использования Python?) Возможно, ваша проблема в том, что запрос действительно не соответствует данным.

SQLiteMan - хороший инструмент для прямого манипулирования базами данных SQLite.


Вы также можете сжать свой блок if ... else до одного оператора, используя dict. (Это питонский способ реализации оператора switch ... case, как в других языках.)

queries = { 0: "SELECT * FROM tab1 WHERE Name=?",
            1: "SELECT * FROM tab1 WHERE Age=?",
            2: "SELECT * FROM tab1 WHERE Date=?",
            3: "SELECT * FROM tab1 WHERE Condition=?" }
results = cur.execute ( queries[index], [namen] )

Или еще более компактно:

match_by = {0: 'Name', 1: 'Age', 2: 'Date', 3: 'Condition'}
query = "SELECT * FROM tab1 WHERE %s=?" % match_by[index]
results = cur.execute(query,[namen])

Или даже больше compact, вы можете встроить словарь:

query = "SELECT * FROM tab1 WHERE %s=?" % {0: 'Name', 1: 'Age', 2: 'Date', 3: 'Condition'}[index]
results = cur.execute(query,[namen])

Или компактный однострочный

results = cur.execute("SELECT * FROM tab1 WHERE %s=?" % {0: 'Name', 1: 'Age', 2: 'Date', 3: 'Condition'}[index] ,[namen])
...