当前位置: 首页 > 面试题库 >

Python Sqlite3-数据不会永久保存

黄弘盛
2023-03-14
问题内容

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

我在哪里做错了?


问题答案:

调用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);''')


 类似资料:
  • 问题内容: 我们有一个带有JSON字段的模型,其中插入了用户标志。插入确实可以按预期工作,但是删除某些标志时,它们保留在字段中,并且更改不会持久保存到数据库中。 我们的模型中有以下方法: databasse是postgres,我们对字段类型使用SQLalchemy JSON字段方言。有什么建议吗? 问题答案: 如果您使用的是Postgres <9.4,则无法直接更新JSON字段。您需要 flag_

  • 问题内容: 那可能吗?例如,用户将新的项目/元素添加到arraylist中(bufferedreader进程),并且肯定会发生更改。我的问题是,即使用户多次对arraylist进行更改,也可能永久关闭该列表,即使他们关闭程序并重新打开它也一直存在。 注意:不得使用.txt 很抱歉提出这样的问题,但我对此很好奇。谢谢! 问题答案: 程序停止时,将释放它使用的所有内存,包括ArrayList。除了不关

  • 我正试图从解析通过模拟器中提取一个PDF文件,并保存到我的桌面上,当我的应用程序上的一个按钮被点击时。问题是,无论我做什么,文件不会出现在桌面或其他任何地方。我正在对下载按钮使用此方法 无法将其保存到桌面。

  • 问题内容: 我知道詹金斯上有一个按钮。我对此有一个疑问: 我的配置由一个主要工作和许多子工作组成(跨越各个阶段)。我想知道是否单击主作业中的按钮,子作业中的工件是否也被永久存储?还是我应该进入每个子职位并继续单击按钮? 问题答案: 此选项仅影响当前作业。 如果要保留工件并为所有子工作生成信息,则必须为每个子项目单击“永远保持此生成”。

  • 我正在将日志消息写入Kafka Topic,我希望此主题的保留是永久的。我在Kafka和Kafka Connect(_schemas、连接-配置、连接-状态、连接-偏移等)中看到,有一些特殊主题不会因日志保留时间而删除。如何强制一个主题像这些其他特殊主题一样?是命名约定还是其他属性? 谢啦

  • 问题内容: 这将使用 临时的 302 HTTP状态代码重定向请求: 但是是否可以使用 永久的 301 HTTP状态代码重定向它? 问题答案: 您需要手动设置响应状态和标题。 将状态设置为之前将无效,否则将其设置为之后。