Python sqlite3 select from 语句在获取时返回空列表

标签 python sqlite pygtk

我正在 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))

值由 GUI 提供。

现在,我在搜索对话框中有一个组合框,我将使用它来指定搜索哪种类型(姓名、年龄、日期或条件),因此我使用了所选项目的索引,这就是主模块:

    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 并获取正确的列表, 但是当尝试使用其他列(例如条件)时,它返回一个空列表 [],尽管它打印了正确的索引并看到了正确的列,但我很困惑,请帮助。

最佳答案

编辑:编辑了有关使用 cursor.execute() 的错误信息。

您是否尝试过直接在数据库上运行 SQL 查询(不使用 Python?)您的问题可能是查询,或者确实没有与您的查询匹配的数据。

SQLiteMan是一个直接操作SQLite数据库的好工具。


您还可以使用 dict 将 if...else block 压缩为单个语句。 (这是实现其他语言中的 switch...case 语句的 Python 方式。)

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])

或者甚至紧凑,您可以内联字典:

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])

关于Python sqlite3 select from 语句在获取时返回空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9493161/

相关文章:

python - 通过 smtplib 发送电子邮件

php - 新 Debian 服务器上的 SQLite 性能问题

用于打开 GTK 窗口/对话框并从中获取一些值的 Python 函数

python - Selenium 和 Python — 如何在延迟加载网页中等待元素附加到父级?

python - 使用 AES 在 C 中加密并在 Python 中解密

c# - 为 System.Data.Common 创建自定义驱动程序

python - 透明小部件背景

python - 如何让 gobject.idle_add() 通过引用传递参数?

python - 从 pandas 系列中删除零的最快方法

java - 安卓和数据库