3

这与我之前的查询有些相关..

用 Python 读取一个大文件

问题出在运行时,所以建议我使用 sqlite3 数据库,它将时间减少到毫秒,我很高兴,现在我唯一的问题是,连接到同一文件夹中的不同数据库文件。所有数据库文件都有相同的表。

我正在使用的代码,只读取第一个,似乎没有检查其他数据库。

输出是当老师输入学生ID时,如果在数据库表中找到相关记录,则应该返回相关记录。

我的代码是这样的,但我确信我做错了什么,如果它是一个愚蠢的,请原谅我,因为它是第一次使用 sqlite3。

#other codes above not related to this part
databases = []
directory = "./Databases"
for filename in os.listdir(directory):
    flname = os.path.join(directory, filename)
    databases.append(flname)

for database in databases:
    conn = sqlite3.connect(database)
    conn.text_factory = str
    cur = conn.cursor()
    sqlqry = "SELECT * FROM tbl_1 WHERE std_ID='%s';" % (sudentID)
    try:
        c = cur.execute(sqlqry)
        data = c.fetchall()
        for i in data:
            print "[INFO] RECORD FOUND"
            print "[INFO] STUDENT ID: "+i[1]
            print "[INFO] STUDENT NAME: "+i[2]
            #and some other info
        conn.close()
    except sqlite3.Error as e:
        print "[INFO] "+e

感谢任何指导

4

1 回答 1

2

@Whiskey,有时尝试将问题分解为一个最小的示例并查看它是否有效或在哪里出错会有所帮助。由于您能够在打开数据库名称时看到正在打印的数据库名称,因此我的猜测可能是查询或数据库中的数据存在问题,即使记录似乎在那里。当您说它没有找到您要查找的记录时,它只是什么都不打印,还是在您的异常处理程序中打印出“[INFO]”行?

我整理了以下最小示例,就我对您的问题的理解而言,它似乎有效。我唯一要添加到其他所有人的建议是将您的查询参数化,而不是直接使用原始输入来使您的应用程序更安全一些。希望能帮助到你:

import os, sqlite3


"""
Create the test databases:

sqlite3 Databases/test_db1.db

sqlite> CREATE TABLE foo ( id INTEGER NOT NULL, name VARCHAR(100), PRIMARY KEY (id) );
sqlite> 


sqlite3 Databases/test_db2.db
sqlite> CREATE TABLE foo ( id INTEGER NOT NULL, name VARCHAR(100), PRIMARY KEY (id) );
sqlite> INSERT INTO foo VALUES (2, 'world');

"""


databases = []
student_id = 2

directory = "./Databases"
for filename in os.listdir(directory):
    flname = os.path.join(directory, filename)
    databases.append(flname)

for database in databases:

    try:

        with sqlite3.connect(database) as conn:

            conn.text_factory = str
            cur = conn.cursor()
            sqlqry = "SELECT * FROM foo WHERE id=:1;"
            c = cur.execute(sqlqry, [student_id])

            for row in c.fetchall():
                print "-- found: %s=%s" % (row[0], row[1])

    except sqlite3.Error, err:
        print "[INFO] %s" % err
于 2012-08-07T18:05:15.433 回答