Лучшие практики для миграции базы данных в приложении для Sqlite

Я голосую OcaIDE . Теперь он обновился до v1.2.5. она стала современной IDE (поддерживающей ocaml 3.10-3.11, особенно ocamlbuild, которая очень экономит время) и оснащена богатыми стабильными функциями.

Я установил OcaIDE на затмение 3.5 (Galileo), и оно работает хорошо.

86
задан Boon 13 June 2009 в 00:02
поделиться

4 ответа

Я поддерживаю приложение, которому периодически необходимо обновлять базу данных sqlite и переносить старые базы данных на новую схему, и вот что я делаю:

Для отслеживания версии базы данных я использую встроенную переменную версии пользователя, предоставляемую sqlite. (sqlite ничего не делает с этой переменной, вы можете использовать ее как хотите). Он начинается с 0, и вы можете получить / установить эту переменную с помощью следующих операторов sqlite:

> PRAGMA user_version;  
> PRAGMA user_version = 1;

Когда приложение запускается, я проверяю текущую версию пользователя, примените любые изменения, необходимые для обновления схемы, а затем обновите user-version. Я заключаю обновления в транзакцию, чтобы, если что-то пойдет не так, изменения не будут зафиксированы.

Для внесения изменений в схему sqlite поддерживает синтаксис «ALTER TABLE» для определенных операций (переименование таблицы или добавление столбца). Это простой способ обновить существующие таблицы на месте. См. Документацию здесь: http://www.sqlite.org/lang_altertable.html . Для удаления столбцов или других изменений, которые не поддерживаются синтаксисом «ALTER TABLE», я создаю новую таблицу, переношу в нее дату, удаляю старую таблицу и переименовываю новую таблицу с исходным именем.

t подтвержден.

Для внесения изменений в схему sqlite поддерживает синтаксис «ALTER TABLE» для определенных операций (переименование таблицы или добавление столбца). Это простой способ обновить существующие таблицы на месте. См. Документацию здесь: http://www.sqlite.org/lang_altertable.html . Для удаления столбцов или других изменений, которые не поддерживаются синтаксисом «ALTER TABLE», я создаю новую таблицу, переношу в нее дату, удаляю старую таблицу и переименовываю новую таблицу с исходным именем.

t подтвержден.

Для внесения изменений в схему sqlite поддерживает синтаксис «ALTER TABLE» для определенных операций (переименование таблицы или добавление столбца). Это простой способ обновить существующие таблицы на месте. См. Документацию здесь: http://www.sqlite.org/lang_altertable.html . Для удаления столбцов или других изменений, которые не поддерживаются синтаксисом «ALTER TABLE», я создаю новую таблицу, переношу в нее дату, удаляю старую таблицу и переименовываю новую таблицу с исходным именем.

103
ответ дан 24 November 2019 в 08:02
поделиться

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

1
ответ дан 24 November 2019 в 08:02
поделиться

Ответ Just Curious мертв- (вы поняли мою точку зрения!), и это то, что мы используем для отслеживания версии схемы базы данных, которая в настоящее время находится в приложении.

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

- (void) migrateToSchemaFromVersion:(NSInteger)fromVersion toVersion:(NSInteger)toVersion { 
    // allow migrations to fall thru switch cases to do a complete run
    // start with current version + 1
    [self beginTransaction];
    switch (fromVersion + 1) {
        case 3:
            // change pin type to mode 'pin' for keyboard handling changes
            // removing types from previous schema
            sqlite3_exec(db, "DELETE FROM types;", NULL, NULL, NULL);
            NSLog(@"installing current types");
            [self loadInitialData];
        case 4:
            //adds support for recent view tracking
            sqlite3_exec(db, "ALTER TABLE entries ADD COLUMN touched_at TEXT;", NULL, NULL, NULL);
        case 5:
            {
                sqlite3_exec(db, "ALTER TABLE categories ADD COLUMN image TEXT;", NULL, NULL, NULL);
                sqlite3_exec(db, "ALTER TABLE categories ADD COLUMN entry_count INTEGER;", NULL, NULL, NULL);
                sqlite3_exec(db, "CREATE INDEX IF NOT EXISTS categories_id_idx ON categories(id);", NULL, NULL, NULL);
                sqlite3_exec(db, "CREATE INDEX IF NOT EXISTS categories_name_id ON categories(name);", NULL, NULL, NULL);
                sqlite3_exec(db, "CREATE INDEX IF NOT EXISTS entries_id_idx ON entries(id);", NULL, NULL, NULL);

               // etc...
            }
    }

    [self setSchemaVersion];
    [self endTransaction];
}
29
ответ дан 24 November 2019 в 08:02
поделиться

Лучшее решение IMO - создать инфраструктуру обновления SQLite. У меня была такая же проблема (в мире C #), и я построил свой собственный фреймворк. Вы можете прочитать об этом здесь . Он работает отлично и заставляет мои (ранее кошмарные) обновления работать с минимальными усилиями с моей стороны.

Хотя библиотека реализована на C #, идеи, представленные в ней, должны работать и в вашем случае.

4
ответ дан 24 November 2019 в 08:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: