2012-08-07 81 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