2013-12-10 46 views
0

我試圖在python腳本中使用SQLite插入操作,它在我在命令行上手動執行它時起作用,但是當我嘗試訪問它時它不會將它插入數據庫中。這裏是我的功能:Python腳本中的SQLite插入命令不適用於網絡

def insertdb(unique_id,number_of_days): 
     conn = sqlite3.connect('database.db') 
     print "Opened database successfully"; 
     conn.execute("INSERT INTO IDENT (ID_NUM,DAYS_LEFT) VALUES (?,?)",(unique_id,number_of_days)); 
     conn.commit() 
     print "Records created successfully"; 
     conn.close() 

當在網絡上執行,它只顯示輸出「打開數據庫成功」,但似乎並沒有該值插入數據庫。我錯過了什麼?這是服務器配置問題嗎?我已經在寫入時檢查了數據庫權限,並且它們已正確設置。

+0

sqlite的臨時寫入日誌文件。您的數據庫所在的目錄需要您的Web服務器擁有寫入權限。可以? –

+0

你知道我會在哪裏改變這個嗎? –

+2

通常,包含目錄需要具有對Web服務器用戶(或組)的讀/寫/執行權限。例如:如果你是web服務器用戶/組是apache/apache,下面應該修復這個問題:''chmod 775/path/to/db/dir''和'chown apache:apache/path/to/db/dir' ' –

回答

2

的問題是幾乎可以肯定的是,你正在試圖創建或打開以任何恰好是當前工作目錄中名爲database.db數據庫,下列條件之一爲真:

  • 數據庫存在,您無權寫入。所以,一切工作,直到你試圖做某些事情需要寫入權限(如commit ing INSERT)。
  • 數據庫存在,並且您有權寫入該數據庫,但您無權在該目錄中創建新文件。所以,一切工作,直到sqlite需要創建一個臨時文件(它幾乎總是會爲execute-一個INSERT)。

同時,你沒有提到什麼web服務器/容器/等等。你正在使用,但顯然你已經將它配置爲只是靜靜地吞下所有錯誤,這對於任何調試來說都是非常糟糕的主意。將其配置爲以某種方式報告錯誤。否則,你會從來沒有找出發生了什麼事情出了什麼問題。

如果你沒有對服務器配置的控制,你至少可以包裝所有的代碼在try/except和手動登錄異常的一些文件,你必須通過logging模塊理想地(寫訪問,或只openwrite,如果最壞的情況最差)。

或者,你可以做到這一點與啞print語句,因爲你已經做:

def insertdb(unique_id,number_of_days): 
     conn = sqlite3.connect('database.db') 
     print "Opened database successfully"; 
     try: 
      conn.execute("INSERT INTO IDENT (ID_NUM,DAYS_LEFT) VALUES (?,?)",(unique_id,number_of_days)); 
      conn.commit() 
      print "Records created successfully"; 
     except Exception as e: 
      print e # or, better, traceback.print_exc() 
     conn.close() 
+0

太棒了,您說的沒錯,我似乎沒有正確的權限來通過網絡對數據庫執行INSERT操作。不確定如何去做這件事,但至少我知道什麼是錯的,這是一場戰鬥。 –

+0

@RayY:我解釋了從哪裏開始看我的回答,以及我的評論,以及詹姆斯米爾斯的評論。什麼是'database.db'居住的當前工作目錄? Web服務器運行的用戶是什麼? 'database.db'及其所在目錄的所有權和許可權是什麼?如果Web服務器用戶有一個外殼程序,它可能有助於以該用戶身份登錄並直接在命令行Python解釋器中運行腳本。如果你需要更多的權限幫助,請到[SuperUser](http://superuser.com)查詢。 – abarnert