Я создаю свою БД с помощью 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())
Выполнение вашей второй программы дважды дает мне sqlite3.IntegrityError: UNIQUE constraint failed: members.discord_id
, как и ожидалось.
Хорошая точка зрения ! Я забыл это. Я, честно говоря, понятия не имею, как это работало раньше без него. Но я добавил его, и у меня все еще та же проблема ...
Я не могу понять, как
DATABASE_LOCATION
волшебным образом получил правильные значения в вашем тестовом скрипте