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

时间:2017-11-28 20:42:31

标签: python sqlite relational-database disk-io

我是一名刚刚开始使用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行运行它时,将输入指向:内存:它完美地运行,我自己拥有我认为的关系数据库。

但是,当我尝试运行这样的代码,将数据写入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

我已经搜索了stackoverflow,并且我使用了谷歌,但我认为我找到的任何案例都不符合我在这里要做的事情(或者我没有相关的知识)出去了什么)。我注意到我的代码的另一件事是它将数据快速输入到内存中,但是当我写入db文件时它非常慢,它不应该是硬件限制,因为我使用的是SSD。任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:3)

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

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

暂停同步时,您的Google云端硬盘文件夹更像普通目录。

(点击 - &gt;设置 - &gt;暂停/恢复)

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

sqlite3.connect('lowercase_name.db')

答案 4 :(得分:-1)

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

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