2016-09-23 5 views
0

sqliteデータベースに複数のレコードを挿入しようとしています。これは私のテストスクリプトです。私は二回上記のスクリプトを実行するとSqlite3の挿入はPythonでレコードを保持しません

import sqlite3 
from datetime import datetime 
company = 'fghjk' 
keyword = 'awesome' 
filename = 'test.txt' 
date_found = datetime.now() 
conn = sqlite3.connect('C:\\sqlite\\test.db') 
c = conn.cursor() 

for i in range(0,4): 
    insert_query = "INSERT into records (company,keyword,filename,date_found) values (?,?,?,?)" 
    c.execute(insert_query, [company,keyword,filename,date_found]) 

select_query = "SELECT * FROM records" 
c.execute(select_query) 
res = c.fetchall() 
print res 
for i in res: 
    for b in i: 
     print b 

、私は8つのレコードを持っていることを期待していますが、それは常にバック4行を与えています。誰かが私を啓発することはできますか?

出力:

1 
fghjk 
awesome 
test.txt 
2016-09-23 09:11:19.585000 
2 
fghjk 
awesome 
test.txt 
2016-09-23 09:11:19.585000 
3 
fghjk 
awesome 
test.txt 
2016-09-23 09:11:19.585000 
4 
fghjk 
awesome 
test.txt 
2016-09-23 09:11:19.585000 

これは私のテーブルの作成文です。

conn.execute('''CREATE TABLE records 
     # (ID INTEGER PRIMARY KEY AUTOINCREMENT, 
     # company   TEXT NOT NULL, 
     # keyword   INT  NOT NULL, 
     # filename  CHAR(50), 
     # date_found  DATETIME);''') 
+0

スクリプトの最後に接続を閉じてみましたか?接続を使用するすべてのコードを 'with conn:'でラップすると、より簡単に達成できます。私はこれを実行し、問題は見ません。 –

+0

私はスクリプトの最後に 'close()'を追加しました。それと同じ結果。あなたは答えを投稿する気になるでしょうか?ありがとうございました。 @PaulRooney – essramos

答えて

2

問題は、データをデータベースにコミットしていないように見えます。

データベースを開くたびに、4行を入れてから印刷し、変更をコミットせずにカーソルと接続を破棄させます。

すべての挿入が完了した後にconn.commit()を呼び出すと、これが解決されます。 IIRCでは、テーブル作成は実行後すぐに自動的にコミットされるため、データベースに保存されます。

+0

よろしく。うん。あなたが正しい。私はコミットを忘れた。ありがとうございました! @cco – essramos

3

この接続はコンテキストマネージャとして使用できます。これにより、コミットを含む接続が正常に終了します。

import sqlite3 
from datetime import datetime 
company = 'fghjk' 
keyword = 'awesome' 
filename = 'test.txt' 
date_found = datetime.now() 
conn = sqlite3.connect('test.db') 
first = False 

# use context manager here!! 
with conn: 
    c = conn.cursor() 
    if first: 
     conn.execute('''CREATE TABLE records 
      (ID INTEGER PRIMARY KEY AUTOINCREMENT, 
      company   TEXT NOT NULL, 
      keyword   INT  NOT NULL, 
      filename  CHAR(50), 
      date_found  DATETIME);''') 

    for i in range(0,4): 
     insert_query = "INSERT into records (company,keyword,filename,date_found) values (?,?,?,?)" 
     c.execute(insert_query, [company,keyword,filename,date_found]) 

    select_query = "SELECT * FROM records" 
    c.execute(select_query) 
    res = c.fetchall() 
    print res 
    for i in res: 
     for b in i: 
     print b 
+0

この度はありがとうございました! @Paul – essramos

関連する問題