2012-08-07 149 views
3

这是一定的相关性我刚才的查询..如何连接到多个sqlite3的数据库与Python

Reading A Big File With 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 

感谢任何导游

+0

我不明白这是如何代码可能的工作,它应产生于'sudentID' – Daenyth 2012-08-07 17:09:35

+2

一个NameError @Daenyth有在代码 – 2012-08-07 17:10:36

+0

抛开一些评论的顶部评论:我会写入1)'databases = [os.path.join(directory,filename)for os.listdir(directory)]'; 2)'sqlite3.connect(database)as conn:...' – khachik 2012-08-07 17:11:28

回答

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 
+1

真棒,万分感谢,现在它读取,它的数据库文件,欢呼声,你有点救了我的工作.. appreciated ..但我没有undertnad仍然为什么我的结构力量的工作,可能我会仔细研究它,后我克服这个头痛..再次感谢.. – Whiskey 2012-08-07 18:32:22

+2

你的实际代码没有工作,因为我们在聊天中发现,因为你忽略了几种类型的例外。如果您记录或打印异常消息,则会发现该错误。 – Todd 2012-08-07 18:35:50