Миграция Sqlite3 - Нет такой таблицы - основной. - PullRequest
0 голосов
/ 25 января 2020

Ниже описывается, как я пишу свою миграцию SQL для приложения, которое я разрабатываю.

  1. ALTER текущая таблица и RENAME она с суффиксом _old.
  2. CREATE новая таблица с измененной схемой.
  3. INSERT значения из старой таблицы.

Это мой запрос на миграцию:

/* Registration */

ALTER TABLE registration RENAME TO registration_old;

CREATE TABLE IF NOT EXISTS registration (
    registration_id INTEGER PRIMARY KEY,
    kid_id INTEGER,
    mode_of_payment STRING,
    online_payment_status STRING,
    payment_id STRING,
    timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
    event_id INTEGER,
    consent_signature STRING DEFAULT NULL,
    UNIQUE (kid_id, event_id)
    FOREIGN KEY(event_id) REFERENCES event(event_id)
    ON UPDATE CASCADE ON DELETE SET NULL
    FOREIGN KEY(kid_id) REFERENCES kid(kid_id)
    ON UPDATE CASCADE ON DELETE NO ACTION
);

INSERT INTO registration (
    registration_id, kid_id, mode_of_payment,
    online_payment_status, payment_id, 
    timestamp, event_id, consent_signature)
SELECT
    registration_id, kid_id, mode_of_payment,
    online_payment_status, payment_id, 
    timestamp, event_id, consent_signature
FROM
    registration_old;

DROP TABLE registration_old;

/* User */

ALTER TABLE user RENAME TO user_old;

CREATE TABLE IF NOT EXISTS user (
    user_id INTEGER PRIMARY KEY,
    user_name STRING,
    user_email STRING,
    user_pwd_hash STRING,
    user_first_name STRING,
    user_last_name STRING,
    user_role_id INTEGER DEFAULT 4,
    parent_id INTEGER DEFAULT NULL,
    confirmation_status STRING DEFAULT False,
    creation_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    last_login_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY(user_role_id) REFERENCES user_role(user_role_id)
    ON UPDATE CASCADE ON DELETE SET DEFAULT
    FOREIGN KEY(parent_id) REFERENCES parent(parent_id)
    ON UPDATE CASCADE ON DELETE SET DEFAULT
    UNIQUE (user_name)
    UNIQUE (user_email)
);

INSERT INTO user (
    user_id, user_name, user_email, 
    user_pwd_hash, user_first_name, 
    user_last_name, user_role_id, 
    confirmation_status)
SELECT
    user_id, user_name, user_email, 
    user_pwd_hash, user_first_name, 
    user_last_name, user_role_id, 
    confirmation_status
FROM
    user_old;

DROP TABLE user_old;

При запуске я получаю следующую ошибку в строке DROP TABLE user_old.

Result: no such table: main.registration_old
At line 69:
DROP TABLE user_old;

Теперь я не понимаю, почему DROP TABLE user_old вызывает то, что требует registration_old. Как они вообще связаны? Я также попытался запустить их по отдельности. Регистрация блок запроса выполняется без ошибок, но когда я запускаю user block, возникает та же ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...