ошибка дискового ввода-вывода с SQLite3 в Python 3 при записи в базу данных

Я студент, только начинающий работать с 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:, он работает отлично, и у меня есть то, что я считаю реляционной базой данных.

Однако, когда я пытаюсь запустить такой код, записывая данные в файл базы данных, я получаю эту ошибку:

 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 и использовал Google, но я не думаю, что какой-либо из найденных случаев соответствует тому, что я пытаюсь сделать здесь (или у меня нет знаний, чтобы понять, что происходит). на). Еще одна вещь, которую я заметил в своем коде, заключается в том, что он очень быстро вводит данные в память, но когда я пишу в файл базы данных, это происходит очень медленно, это не должно быть аппаратным ограничением, поскольку я использую SSD. Любая помощь будет оценена!


person Xander Blaauw    schedule 28.11.2017    source источник
comment
Вы пишете в NFS? См. это: ссылка   -  person Josh Dinsdale    schedule 28.11.2017
comment
Похоже на тривиальную проблему, например права на запись, попробуйте записать в каталог, где у вас наверняка есть разрешение на запись.   -  person Marco    schedule 29.11.2017


Ответы (5)


Настройка резервного копирования/синхронизации на паузу на значке на панели задач при работе с проектом, хранящимся на Google Диске, предотвратит ошибки ввода-вывода на диске.

Это связано с тем, что когда файл записывается или изменяется, резервное копирование и синхронизация пытается загрузить новую версию на ваш Google Диск, пока она это делает; файл становится файлом «только для чтения».

Пока синхронизация приостановлена, ваша папка Google Диска больше похожа на обычный каталог.

(нажмите -> настройки -> пауза/возобновить)

person Owen Easter    schedule 27.01.2018
comment
У меня была аналогичная проблема с файлом, синхронизированным с Dropbox. Приостановка синхронизации Dropbox решила проблему. - person chenware; 31.03.2018
comment
@chenware - То же самое здесь. Я могу подтвердить, что эта проблема возникает и при использовании Dropbox, что имеет смысл, поскольку он использует примерно тот же процесс, что и Google Диск. - person Pikamander2; 10.12.2019

Я знаю, что могу отвечать очень поздно, но для других... У меня была та же проблема, и проблема, которую я обнаружил, заключалась в том, что код Python уже использовал эту базу данных. Когда я остановил код и снова запустил основной код, он сработал.

person RaPiDfire69    schedule 10.03.2021

Другая причина этой проблемы заключается в том, что файл журнала недоступен для записи, но файл данных SQLite доступен для записи. Если файл данных SQLite недоступен для записи, он сообщит вам, что вы пытаетесь записать в базу данных, доступную только для чтения. Но если файл базы данных доступен для записи, но файл журнала (имя файла такое же, как у файла данных SQLite, но заканчивается на -journal) недоступен для записи, вместо этого вы получите ошибку ввода-вывода.

person Alan Robertson    schedule 12.11.2018

Не проблема с вашим, но я получаю сообщение об ошибке с использованием символов верхнего регистра в имени моего файла db. Изменил его и исправил эту проблему... Стоит попробовать другим!

sqlite3.connect('lowercase_name.db')
person Tanner Clark    schedule 26.12.2020

Ответ был прост: я работал в своем каталоге Google Диска на своем персональном компьютере, во время ошибки я был в автономном режиме, а программа резервного копирования и синхронизации не работала, поэтому мне потребовалось некоторое время, чтобы понять, что я все еще не иметь полные права доступа к папке.

Перемещение моего скрипта и необходимых файлов в папку в моих документах исправило ошибку. Спасибо за помощь, Марко и Джош!

person Xander Blaauw    schedule 08.12.2017
comment
Возможно, вы нашли решение, но ваш ответ вводит в заблуждение и недостаточно информирован, а ваш совет бесполезен для других. - person Owen Easter; 11.07.2020