У меня есть следующие таблицы базы данных sqlite:
CREATE TABLE IF NOT EXISTS Channel (
channel_id integer UNIQUE NOT NULL,
channel_name text UNIQUE NOT NULL,
PRIMARY KEY (channel_id)
);
CREATE TABLE IF NOT EXISTS User_banned (
user_id integer NOT NULL,
login_name text NOT NULL,
channel_id integer NOT NULL,
ban_timestamp real NOT NULL,
PRIMARY KEY (user_id, channel_id, ban_timestamp),
FOREIGN KEY (channel_id) REFERENCES channel (channel_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS Message_deleted (
user_id integer NOT NULL,
channel_id integer NOT NULL,
ban_timestamp real NOT NULL,
message_timestamp real NOT NULL,
message text NOT NULL,
PRIMARY KEY (user_id, message_timestamp),
FOREIGN KEY (user_id, channel_id, ban_timestamp) REFERENCES User_banned (user_id, channel_id, ban_timestamp) ON DELETE CASCADE
);
Я сгенерировал модель peewee с помощью pwiz, добавив аргумент on_delete='CASCADE'
для всех внешних ключей, потому что pwiz не генерирует ее и подключается к базе данных с помощью прагм. 'foreign_keys': 1
.
У меня есть этот код для теста:
database.connect()
database.create_tables([Channel, UserBanned, MessageDeleted])
Channel.create(channel_id=1111, channel_name="channel1")
UserBanned.create(ban_timestamp=4551, login_name="d", channel=1111, user_id=511)
MessageDeleted.create(ban_timestamp=4551, message="message", message_timestamp=4511, channel=1111, user=511)
print(Channel.delete().execute())
database.close()
Когда я создаю таблицы путем импорта файла sql с помощью sqlitebrowser, у меня нет проблем, но если таблицы созданы peewee, я получил эту ошибку: peewee.OperationalError: foreign key mismatch - "Message_deleted" referencing "User_banned"