写入数据库时​​,Python 3 中 SQLite3 的磁盘 I/O 错误

Posted

技术标签:

【中文标题】写入数据库时​​,Python 3 中 SQLite3 的磁盘 I/O 错误【英文标题】:disk I/O error with SQLite3 in Python 3 when writing to a database 【发布时间】:2018-05-12 10:38:24 【问题描述】:

我是一名刚开始接触 python 的学生,我的任务是创建一个关系数据库管理系统。我想我走了很远,但我似乎碰壁了。这是我的代码:

import csv
import sqlite3

conn = sqlite3.connect('unfccc.db')
c = conn.cursor()

c.execute('''CREATE TABLE unfccc (
        Country TEXT, 
        CodeCountryFormat TEXT, 
        NamePollutant TEXT, 
        NameYearSector TEXT, 
        NameParent TEXT, 
        Sector TEXT, 
        CodeSector TEXT, 
        CNUEDSPD TEXT
        )''')

def insert_row(Country, CodeCountryFormat, NamePollutant, NameYearSector, NameParent, Sector, CodeSector, CNUEDSPD):
    c.execute("INSERT INTO unfccc VALUES (?, ?, ?, ?, ?, ?, ?, ?)", (Country, CodeCountryFormat, NamePollutant, NameYearSector, NameParent, Sector, CodeSector, CNUEDSPD))
    conn.commit()

with open('UNFCCC_v20.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter='\t')

    counter = 0

    for row in readCSV:
        insert_row(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7])
        counter = counter+1
        print('%d down, more to go' % counter)
conn.close()

当我使用第 4 行将输入指向 :memory: 运行它时,它完美运行,我拥有我认为的关系数据库。

但是,当我尝试像这样运行代码,将数据写入 db 文件时,我收到此错误:

 File "<ipython-input-13-4c50216842bc>", line 19, in insert_row
    c.execute("INSERT INTO unfccc VALUES (?, ?, ?, ?, ?, ?, ?, ?)", (Country, CodeCountryFormat, NamePollutant, NameYearSector, NameParent, Sector, CodeSector, CNUEDSPD))

OperationalError: disk I/O error

我已经搜索了 ***,并且我使用了谷歌,但我认为我发现的任何案例都不符合我在这里尝试做的事情(或者我不知道如何计算出了什么事)。我注意到我的代码的另一件事是它将数据输入到内存中的速度非常快,但是当我写入 db 文件时它真的很慢,它不应该是硬件限制,因为我使用的是 SSD。任何帮助将不胜感激!

【问题讨论】:

您正在写入 NFS 吗?看到这个:link 貌似是写权限之类的小问题,试试写到你确定有写权限的目录。 【参考方案1】:

在处理存储在 Google Drive 上的项目时,将备份/同步设置为在系统托盘图标上暂停可以防止磁盘 i/o 错误。

这是因为当文件被写入或更改时,备份和同步会尝试将新版本上传到您的 Google 云端硬盘,同时它正在执行此操作;该文件变为“只读”文件。

当同步暂停时,您的 Google Drive 文件夹更像是一个普通目录。

(点击 -> 设置 -> 暂停/恢复)

【讨论】:

我在操作 Dropbox 同步的文件时遇到了类似的问题。暂停 Dropbox 同步解决了这个问题。 @chenware - 这里也一样。我可以确认在使用 Dropbox 时也会出现此问题,这是有道理的,因为它使用与 Google Drive 大致相同的过程。【参考方案2】:

我知道我可能回答得太晚了,但对于其他人......我遇到了同样的问题,我发现的问题是 python 代码已经在使用该数据库。当我停止代码并再次运行主代码时,它确实有效..

【讨论】:

【参考方案3】:

这个问题的另一个原因是如果日志文件不可写,但 SQLite 数据文件是可写的。如果 SQLite 数据文件不可写,它会告诉您您正在尝试写入只读数据库。但是如果数据库文件是可写的,但是日志文件(文件名与 SQLite 数据文件相同,但以 -journal 结尾)是不可写的,它会给你一个 I/O 错误。

【讨论】:

【参考方案4】:

你的不是问题,但我在我的 db 文件名中使用大写字符时出错。更改并修复了此问题...值得其他人尝试!

sqlite3.connect('lowercase_name.db')

【讨论】:

【参考方案5】:

答案很简单,我在个人计算机上的 Google Drive 目录中工作,发生错误时我处于离线状态,并且备份和同步程序没有运行,因此我花了一段时间才意识到我仍然对该文件夹没有完全权限。

将我的脚本和必要的文件移动到我的文档中的文件夹修复了错误。感谢 Marco 和 Josh 的帮助!

【讨论】:

您可能已经找到了解决方案,但您的回答颇具误导性且信息不充分——您的建议对其他人没有帮助。

以上是关于写入数据库时​​,Python 3 中 SQLite3 的磁盘 I/O 错误的主要内容,如果未能解决你的问题,请参考以下文章

Python与sqlit数据库--简单介绍

写入数据库时​​,Python 3 中 SQLite3 的磁盘 I/O 错误

flask框架+pygal+sqlit3搭建图形化业务数据分析平台

flask框架+pygal+sqlit3搭建图形化业务数据分析平台

sqlit中使用到的查询语句

构建新的 Rails 应用程序加载“sqlite3”时出错,而没有明显写入版本