2014-09-26 74 views
1

即時得到這個錯誤:蟒蛇SQLITE3重開數據庫

sqlite3.ProgrammingError: Cannot operate on a closed database. 

,怎樣才能再次打開數據庫,之後我關閉了嗎?

我想關閉它,然後重新打開會是一個好主意,因爲我有一個循環,將運行幾個小時:

for x in tweets: 
    conn = sqlite3.connect("...") 
    .... 
    conn.close() 
    time.sleep(1800) #30 minutes 

但是當它到達第二個循環,它給我的關閉數據庫錯誤。

+0

它可能更好(並且更高效/沒有bug)只是偶爾執行'conn.commit()' – matsjoyce 2014-09-26 18:12:08

+0

在完成之前,不需要關閉數據庫連接。 – 2014-09-26 18:12:14

+0

@MartijnPieters,看看睡眠。我想他不想在接下來的30分鐘內保持連接。 – user3885927 2014-09-26 18:13:13

回答

2

我想說這裏還有其他的東西。我使用Python 2和3運行以下代碼(儘管對於Python 2,我只用2秒的time.sleep進行測試),並且它工作正常。

import sqlite3, time 
conn = sqlite3.connect('example.db') 

# Set up table (adding because doing nothing with database didn't cause the error) 
c = conn.cursor() 
c.execute('CREATE TABLE tweets (tweet text)') 
conn.commit() 

tweets = ['a','b','c'] 

for x in tweets: 
    print('Tweet: ',x) 
    conn = sqlite3.connect("example.db") 

    # Extra stuff to try make it error 
    c = conn.cursor() 
    c.execute('INSERT INTO tweets VALUES (?)', x) 
    conn.commit() 

    conn.close() 
    time.sleep(1800) #30 minutes 


# Cleanup so I can run test a few times 
conn = sqlite3.connect("example.db") 
c = conn.cursor() 
c.execute('DROP TABLE tweets') 

我能得到這個代碼生成,如果我在註釋掉conn分配for循環您收到同樣的錯誤。