一尘不染

Python Sqlite3-数据不会永久保存

python

我对 SQLite3Python 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()

我在哪里做错了?


阅读 380

收藏
2021-01-20

共1个答案

一尘不染

调用conn.commit()将事务刷新到磁盘

程序退出时,最后一个未完成的事务将回滚到最后一个提交。(或更准确地说,回滚是由下一个打开数据库的程序完成的。)因此,如果commit从不调用,则不会对数据库进行任何更改。

请注意,根据文档

连接对象可用作自动提交或回滚事务的上下文管理器。发生异常时,事务将回滚;否则,将提交事务:

因此,如果您使用这样的with语句:

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);''')
2021-01-20