You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure App Service部署Django时Sqlite数据库锁定问题求助

Django + Azure App Service SQLite迁移数据库锁定问题解决

问题背景

将Django应用部署至Azure App Service,使用SQLite数据库,配置如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/home/site/wwwroot/db.sqlite',
    }
}

构建后操作配置:

- name: Set migration command on App Service
  uses: Azure/appservice-settings@v1
  with:  
    app-name: 'example-app'
    app-settings-json: '[{ "name": "DISABLE_COLLECTSTATIC", "value": "true" }, { "name": "POST_BUILD_COMMAND",  "value": "python manage.py makemigrations && python manage.py migrate" }, { "name": "SCM_DO_BUILD_DURING_DEPLOYMENT", "value": "true" }]'

首次执行迁移时出现数据库锁定错误:

Executing post-build command...
No changes detected
Operations to perform:
Traceback (most recent call last):
  Apply all migrations: admin, auth, calculator, conf, contenttypes
  File "/tmp/8db81f47570a6b0/antenv/lib/python3.11/site-packages/django/db/backends/base/base.py", line 306, in _commit
Running migrations:
    return self.connection.commit()
           ^^^^^^^^^^^^^^^^^^^^^^^^
sqlite3.OperationalError: database is locked

解决步骤

1. 迁移执行时机调整

Azure App Service的构建阶段(POST_BUILD_COMMAND运行时)处于临时容器环境,此时持久化存储可能未完全挂载,或存在进程竞争访问SQLite文件。建议将迁移逻辑移至应用启动时执行:

  • 修改项目的wsgi.py(或asgi.py),添加迁移执行代码:
import os
from django.core.wsgi import get_wsgi_application
from django.core.management import call_command

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')

# 启动前执行迁移
try:
    call_command('migrate')
except Exception as e:
    print(f"Migration error: {e}")

application = get_wsgi_application()
  • 更新App Service配置,移除POST_BUILD_COMMAND中的迁移命令,保留必要配置:
app-settings-json: '[{ "name": "DISABLE_COLLECTSTATIC", "value": "true" }, { "name": "SCM_DO_BUILD_DURING_DEPLOYMENT", "value": "true" }]'

2. 优化SQLite数据库配置

调整SQLite的锁定和超时设置,减少锁定概率:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/home/site/wwwroot/db.sqlite',
        'OPTIONS': {
            'timeout': 30,  # 延长数据库锁定超时时间
            'isolation_level': 'READ COMMITTED',  # 降低隔离级别减少锁冲突
        },
    }
}

3. 验证存储挂载配置

  • 登录Azure门户,进入目标App Service -> 配置 -> 常规设置,确认"持久化存储"已启用(默认开启,若未开启需启用)。
  • 确保/home/site/wwwroot目录的读写权限:应用运行身份对该目录拥有读写权限,若存在权限问题可通过App Service的SSH终端执行ls -l /home/site/wwwroot验证。

4. 调试方法

  • 查看实时日志:在Azure门户的App Service -> 日志流,实时监控应用启动和迁移过程的输出,定位具体错误场景。
  • 临时路径测试:将数据库路径改为临时目录'/tmp/db.sqlite',重新部署测试迁移是否正常执行。若临时目录正常,说明问题出在持久化存储的访问时机或权限。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:35:33