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
相关产品推荐
相关产品推荐

