Как наладить процесс обновления системы?

Могу привести простой пример, связанный с работой в Steam - steamworks. Необходимо понимать, что вместо базы данных может использоваться любой файл, это не имеет значения. 

Рассмотрим следующую ситуацию: у нас есть игра, состоящая из исполняемого файла (exe) и файла базы данных. Исполняемый файл содержит код, осуществляющий взаимодействие с базой данных, где, в частности, хранятся данные о сохранениях игрока.

При обновлении игры игроку предоставляется новый исполняемый файл, однако файл базы данных не обновляется, чтобы избежать потери сохранений. 

В рамках одного из обновлений было решено добавить новый параметр — количество монет. Этот код прописан в exe файле, но для его корректной работы необходима запись соответствующей информации в базе данных. Обновить базу данных нельзя, поскольку это приведет к потере сохранений, а оставить старую версию — тоже невозможно, так как новый код в exe файле ожидает наличия этого параметра и может вызвать ошибку, если его не найдет.

В связи с вышеописанным, было принято решение фиксировать версию базы данных и хранить информацию о версии в одной из таблиц базы данных. Изначально версия базы данных составляет 1.0.

Обновление игры включает патч, который автоматически выполняется при запуске исполняемого файла. Патч обновляет базу данных и содержит команды следующего вида: версия базы данных - действие, например:
- 1.0 добавь поле «количество монет»
- 1.0 запиши версию базы данных 1.01 

После выполнения патча в базе данных теперь есть поле для хранения количества монет, и версия базы данных обновилась до 1.01. Исполняемый файл работает без проблем.

В следующем обновлении было решено добавить еще один новый параметр - количество жизней. Патч теперь содержит команды:
- 1.0 добавь поле «количество монет»
- 1.0 запиши версию базы данных 1.01
- 1.01 добавь поле «количество жизней»
- 1.01 запиши версию базы данных 1.02

Патч считывает текущую версию базы данных - 1.01 и выполняет все необходимые команды для корректного функционирования.
  • 2 января 2025 г. 2:03
Ответы на вопрос 2
Процесс обновления системы, особенно в контексте работы с базами данных и исполняемыми файлами в игровой разработке, может быть достаточно сложным. Однако подход, который вы предложили, позволяет эффективно управлять миграцией базы данных, не теряя при этом данные пользователей. Вот несколько шагов и рекомендаций для налаживания такого процесса:

### 1. Поддержка версии базы данных
Сохранение информации о версии базы данных в одной из таблиц — это хороший подход. Это позволяет исполняемому файлу определять, какие изменения необходимо применить.

### 2. Создание системы миграции
Ваша система миграции должна включать в себя:

- **Формат описания миграций:** Используйте простой и понятный формат для описания миграций, который будет легко читать и понимать. Например, вы уже используете команды вида:
  ```
  версия базы данных - действие
  ```

- **Скрипты миграции:** Создайте скрипты, которые будут содержать обновления для каждой версии базы данных. Например, создайте отдельные файлы для миграций с изменениями для каждой версии.

### 3. Логика применения миграций
При запуске игры логика работы с миграциями может выглядеть следующим образом:

- Считать текущую версию базы данных.
- Сравнить ее с последней доступной версией.
- Выполнить все миграции по порядку, начиная с текущей версии и заканчивая последней.

Пример реализации:

```python
def apply_migrations(current_version):
    migrations = [
        (1.0, "ADD COLUMN coins INT DEFAULT 0"),
        (1.01, "UPDATE versions SET version='1.01'"),
        (1.01, "ADD COLUMN lives INT DEFAULT 3"),
        (1.02, "UPDATE versions SET version='1.02'")
    ]
    
    for version, command in migrations:
        if current_version < version:
            execute_sql(command)
            current_version = version  # Обновляем текущую версию

def execute_sql(command):
    # Выполнение SQL-команды
    pass
```

### 4. Обработка ошибок
Убедитесь, что ваша система обновления имеет механизм отката (rollback) на случай, если возникнут ошибки во время миграции. Это позволит предотвратить повреждения базы данных.

### 5. Тестирование
Тестируйте процесс обновления на различных системах и с разными версиями базы данных. Особенно важно протестировать обновления с запуском, чтобы гарантировать, что все патчи применяются корректно.

### 6. Документация
Создайте документацию по процессу обновления, чтобы другие разработчики могли легко следовать установленной процедуре. Это особенно актуально, если в команде много людей.

### 7. Обратная совместимость
Следите за тем, чтобы новые версии исполняемого файла оставались обратнос совместимыми с предыдущими версиями базы данных, если это возможно. Это уменьшит риск сбоев при обновлении.

### 8. Автоматизация
Если возможно, автоматизируйте процесс миграции и обновлений, чтобы снизить вероятность ошибок, которые могут возникнуть при ручном выполнении.

Соблюдая эти рекомендации, вы сможете наладить надежный и безопасный процесс обновления системы, который минимизирует риск потери данных и обеспечивает более плавный переход между версиями.
Последовательные обновления: фиксируется текущее состояние ( BACKUP DATABASE ), обновляется, при необходимости восстанавливается сохранённое предыдущее. (Старый вариант обновления Windows) 
Кумулятивное обновление.
Похожие вопросы