Python Sqlite3 - 数据不会永久保存

时间:2014-11-01 18:16:47

标签: python sqlite

我对 SQLite3 Python 3 做错了。也许我误解了SQLite数据库的概念,但我希望,即使在关闭应用程序之后,数据也会存储在数据库中?当我插入数据并重新打开应用程序时,插入消失,数据库为空。

这是我的小数据库:

import sqlite3

def createTable():
    conn.execute('''CREATE TABLE VideoFile
           (ID INTEGER PRIMARY KEY NULL,
           FileName           TEXT    NOT NULL,
           FilePath           TEXT    NOT NULL,
           numOfFrames            INT     NOT NULL,
           FPS            INT     NOT NULL,
           Tags           TEXT    NOT NULL,
           Voting         REAL);''')


def insert():
    conn.execute("INSERT INTO VideoFile (Filename, FilePath, numOfFrames,FPS, Tags, Voting) \
                              VALUES ('ARCAM_0010_100', 'Categories/Dirt/Small', 2340, 50, 'Bock', 1 )");
    conn.execute("INSERT INTO VideoFile (Filename, FilePath, numOfFrames,FPS, Tags, Voting) \
                              VALUES ('ARCAM_0010_100', 'Categories/Dirt/Small', 2340, 50, 'Bock', 1 )");

def printAll(cursor):   
    cursor = conn.execute("SELECT ID, FileName, FilePath, numOfFrames  from VideoFile")
    for row in cursor:
       print("ID = ", row[0])
       print("FileName = ", row[1])
       print("FilePath = ", row[2])
       print("numOfFrames = ", row[3], "\n")

    print("Operation done successfully")
    conn.close()


conn = sqlite3.connect('AssetBrowser.db')
createTable()

#comment out after executing once
insert()
printAll()

我做错了什么?

1 个答案:

答案 0 :(得分:14)

致电conn.commit()flush the transaction to disk

当程序退出时,最后一个未完成的事务将回滚到上一次提交。 (或者,更确切地说,the rollback is done by the next program to open the database。)因此,如果永远不会调用commit,则数据库不会发生变化。

请注意per the docs

  

连接对象可以用作自动提交的上下文管理器   或回滚事务。如果发生异常,则交易为   回滚;否则,交易已经提交:

因此,如果你使用这样的带语句:

with sqlite3.connect('AssetBrowser.db') as conn:
    createTable()
    insert()
    printAll()

然后当Python离开with-statement时假设没有引发异常的错误,将自动为您提交事务。


顺便说一下,如果你使用CREATE TABLE IF NOT EXISTS,那么 只有在尚不存在的情况下才会创建该表。以这种方式完成后,您无需在调用一次后注释createTable

def createTable():
    conn.execute('''CREATE TABLE IF NOT EXISTS VideoFile
           (ID INTEGER PRIMARY KEY NULL,
           FileName           TEXT    NOT NULL,
           FilePath           TEXT    NOT NULL,
           numOfFrames            INT     NOT NULL,
           FPS            INT     NOT NULL,
           Tags           TEXT    NOT NULL,
           Voting         REAL);''')