Переглянути джерело

feat: add `flask upgrade-db` command for running db upgrade with redis lock (#5333)

tags/0.6.12
Bowen Liang 1 рік тому
джерело
коміт
5f0ce5811a
Аккаунт користувача з таким Email не знайдено

+ 3
- 2
.github/workflows/db-migration-test.yml Переглянути файл

- name: Install dependencies - name: Install dependencies
run: poetry install -C api run: poetry install -C api


- name: Set up Middleware
- name: Set up Middlewares
uses: hoverkraft-tech/compose-action@v2.0.0 uses: hoverkraft-tech/compose-action@v2.0.0
with: with:
compose-file: | compose-file: |
docker/docker-compose.middleware.yaml docker/docker-compose.middleware.yaml
services: | services: |
db db
redis


- name: Prepare configs - name: Prepare configs
run: | run: |
- name: Run DB Migration - name: Run DB Migration
run: | run: |
cd api cd api
poetry run python -m flask db upgrade
poetry run python -m flask upgrade-db

+ 25
- 1
api/commands.py Переглянути файл

import base64 import base64
import json import json
import logging
import secrets import secrets
from typing import Optional from typing import Optional


from core.rag.datasource.vdb.vector_type import VectorType from core.rag.datasource.vdb.vector_type import VectorType
from core.rag.models.document import Document from core.rag.models.document import Document
from extensions.ext_database import db from extensions.ext_database import db
from extensions.ext_redis import redis_client
from libs.helper import email as email_validate from libs.helper import email as email_validate
from libs.password import hash_password, password_pattern, valid_password from libs.password import hash_password, password_pattern, valid_password
from libs.rsa import generate_key_pair from libs.rsa import generate_key_pair
'Account: {}\nPassword: {}'.format(email, new_password), fg='green')) 'Account: {}\nPassword: {}'.format(email, new_password), fg='green'))




@click.command('upgrade-db', help='upgrade the database')
def upgrade_db():
click.echo('Preparing database migration...')
lock = redis_client.lock(name='db_upgrade_lock', timeout=60)
if lock.acquire(blocking=False):
try:
click.echo(click.style('Start database migration.', fg='green'))

# run db migration
import flask_migrate
flask_migrate.upgrade()

click.echo(click.style('Database migration successful!', fg='green'))

except Exception as e:
logging.exception(f'Database migration failed, error: {e}')
finally:
lock.release()
else:
click.echo('Database migration skipped')


def register_commands(app): def register_commands(app):
app.cli.add_command(reset_password) app.cli.add_command(reset_password)
app.cli.add_command(reset_email) app.cli.add_command(reset_email)
app.cli.add_command(convert_to_agent_apps) app.cli.add_command(convert_to_agent_apps)
app.cli.add_command(add_qdrant_doc_id_index) app.cli.add_command(add_qdrant_doc_id_index)
app.cli.add_command(create_tenant) app.cli.add_command(create_tenant)
app.cli.add_command(upgrade_db)

+ 1
- 1
api/docker/entrypoint.sh Переглянути файл



if [[ "${MIGRATION_ENABLED}" == "true" ]]; then if [[ "${MIGRATION_ENABLED}" == "true" ]]; then
echo "Running migrations" echo "Running migrations"
flask db upgrade
flask upgrade-db
fi fi


if [[ "${MODE}" == "worker" ]]; then if [[ "${MODE}" == "worker" ]]; then

+ 0
- 1
api/migrations/README Переглянути файл

Single-database configuration for Flask. Single-database configuration for Flask.


Завантаження…
Відмінити
Зберегти