Изображение SQLite искажено после второго доступа к БД

TL; DR

Я создаю свою БД с помощью SQLite, используя python. Но когда я пытаюсь использовать БД, я могу получить к ней доступ только один раз. Если я попытаюсь получить к нему доступ во второй раз, я получаю сообщение об ошибке image is malformed.

Почему я не могу использовать свою базу данных несколько раз? Я дважды проверяю, правильно ли я закрываю БД. Я не понимаю, что происходит.


Я создаю свою БД с помощью этого скрипта:

import sqlite3

DATABASE_LOCATION = 'Data/database.db'

# exec(open("Scripts/create_db.py").read())

with sqlite3.connect(DATABASE_LOCATION) as db:
    cursor = db.cursor()

    cursor.execute("""
        CREATE TABLE 'members'(
            'discord_id' TEXT NOT NULL, 
            'reputation' INTEGER NOT NULL,
            PRIMARY KEY('discord_id')
            );
    """)

    cursor.execute("""
        CREATE TABLE 'mission'(
            'mission_id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
            'description' TEXT NOT NULL,
            'price' INTEGER NOT NULL,
            'giver' TEXT NOT NULL,
            'receiver' TEXT NOT NULL,
            'complete' INTEGER NOT NULL,
            'create_date' TEXT NOT NULL,
            'complete_date' TEXT,
            FOREIGN KEY('giver') REFERENCES members('discord_id'),
            FOREIGN KEY('receiver') REFERENCES members('discord_id')
            );
    """)

    db.commit()

А потом я использую этот скрипт для теста:

import sqlite3

DATABASE_LOCATION = 'Data/database.db'


db = sqlite3.connect(DATABASE_LOCATION)
cursor = db.cursor()
cursor.execute('''INSERT INTO members(discord_id, reputation) VALUES(?,?)''', ('1', 1))
db.commit()
db.close()

db = sqlite3.connect(DATABASE_LOCATION)
cursor = db.cursor()
cursor.execute('''INSERT INTO members(discord_id, reputation) VALUES(?,?)''', ('2', 2))
db.commit()
db.close()

db = sqlite3.connect(DATABASE_LOCATION)
cursor = db.cursor()
cursor.execute('''INSERT INTO members(discord_id, reputation) VALUES(?,?)''', ('3', 3))
db.commit()
db.close()

db = sqlite3.connect(DATABASE_LOCATION)
cursor = db.cursor()
cursor.execute('''SELECT discord_id, reputation FROM members WHERE       
discord_id=?''', ('2',))
info = cursor.fetchone()
db.close()

print(info)

Запускаю скрипт создания: все нормально. Затем первый раз запускаю тестовый скрипт: все нормально, в консоли отображается ('2', 2).

Затем я запускаю тестовый сценарий во второй раз и получаю следующую ошибку:

Traceback (most recent call last):
  File "python", line 1, in <module>
  File "<string>", line 6, in <module>
sqlite3.DatabaseError: database disk image is malformed

РЕДАКТИРОВАТЬ

Я исправил проблему уникальности (спасибо, что указали на это).

Может быть, это потому, что я запускаю это на Repl.it.

Я поместил этот пример сюда: https://repl.it/@NicolasRemond/SociableFluidOrigin Так что вы можете получить к нему доступ и попробовать. Просто удалите файл базы данных, запустите файл создания с exec(open("create.py").read()) в консоли, а затем другой скрипт exec(open("test.py").read())

Я не могу понять, как DATABASE_LOCATION волшебным образом получил правильные значения в вашем тестовом скрипте

srinath samala 27.10.2018 08:15

Выполнение вашей второй программы дважды дает мне sqlite3.IntegrityError: UNIQUE constraint failed: members.discord_id, как и ожидалось.

Shawn 27.10.2018 09:04

Хорошая точка зрения ! Я забыл это. Я, честно говоря, понятия не имею, как это работало раньше без него. Но я добавил его, и у меня все еще та же проблема ...

Astariul 27.10.2018 10:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
93
0

Другие вопросы по теме