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

Vercel部署Flask+SQLite应用遇只读数据库写入错误求助

问题:Flask+SQLite部署至Vercel后写入数据库提示只读错误

我正在部署一个搭载SQLite数据库的简易Flask应用,本地Windows 10环境运行正常,但通过Github部署到Vercel后,写入数据库时出现以下错误:

OperationalError: attempt to write a readonly database

本地已通过attrib ~/instance命令,以普通用户和管理员身份双重确认数据库及所在instance文件夹均拥有完全访问权限。想请教:能否直接在Github仓库中检查并修改文件或文件夹的访问权限?

相关错误日志如下:

[ERROR] 2023-01-12T17:19:33.931Z    63bacb5b-ec13-4247-b784-9aaba99376a0
    Exception on /register [POST]Traceback (most recent call last):
  File "/var/task/sqlalchemy/engine/base.py", line 1900, in _execute_context    self.dialect.do_execute
(  File "/var/task/sqlalchemy/engine/default.py", line 736, in do_execute    cursor.execute(statement, parameters)
sqlite3.OperationalError: attempt to write a readonly database
The above exception was the direct cause of the following exception:
Traceback (most recent call last):  File "/var/task/flask/app.py", line 2525, in wsgi_app    response = self.full_dispatch_request()  File "/var/task/flask/app.py", line 1822, in full_dispatch_request    rv = self.handle_user_exception(e)  File "/var/task/flask/app.py", line 1820, in full_dispatch_request    rv = self.dispatch_request()  File "/var/task/flask/app.py", line 1796, in dispatch_request    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  File "./app.py", line 136, in register    db.session.commit()  
File "<string>", line 2, in commit  File "/var/task/sqlalchemy/orm/session.py", line 1451, in commit    self._transaction.commit(_to_root=self.future)  File "/var/task/sqlalchemy/orm/session.py", line 829, in commit    self._prepare_impl()  File "/var/task/sqlalchemy/orm/session.py", line 808, in _prepare_impl    self.session.flush()  File "/var/task/sqlalchemy/orm/session.py", line 3444, in flush    self._flush(objects)  File "/var/task/sqlalchemy/orm/session.py", line 3584, in _flush    transaction.rollback(_capture_exception=True)  File "/var/task/sqlalchemy/util/langhelpers.py", line 70, in __exit__    compat.raise_(  File "/var/task/sqlalchemy/util/compat.py", line 211, in raise_    raise exception  File "/var/task/sqlalchemy/orm/session.py", line 3544, in _flush    flush_context.execute()  File "/var/task/sqlalchemy/orm/unitofwork.py", line 456, in execute    rec.execute(self)  File "/var/task/sqlalchemy/orm/unitofwork.py", line 630, in execute    util.preloaded.orm_persistence.save_obj(  File "/var/task/sqlalchemy/orm/persistence.py", line 245, in save_obj    _emit_insert_statements(  File "/var/task/sqlalchemy/orm/persistence.py", line 1238, in _emit_insert_statements    result = connection._execute_20(  File "/var/task/sqlalchemy/engine/base.py", line 1705, in _execute_20    return meth(self, args_10style, kwargs_10style, execution_options)  File "/var/task/sqlalchemy/sql/elements.py", line 334, in _execute_on_connection    return connection._execute_clauseelement(  File "/var/task/sqlalchemy/engine/base.py", line 1572, in _execute_clauseelement    ret = self._execute_context(  File "/var/task/sqlalchemy/engine/base.py", line 1943, in _execute_context    self._handle_dbapi_exception(  File "/var/task/sqlalchemy/engine/base.py", line 2124, in _handle_dbapi_exception    util.raise_(  File "/var/task/sqlalchemy/util/compat.py", line 211, in raise_    raise exception  File "/var/task/sqlalchemy/engine/base.py", line 1900, in _execute_context    self.dialect.do_execute(  File "/var/task/sqlalchemy/engine/default.py", line 736, in do_execute    cursor.execute(statement, parameters)sqlalchemy.exc.
OperationalError: (sqlite3.OperationalError) attempt to write a readonly database
解答
  • 不能直接在Github仓库修改文件/文件夹权限。Github仓库仅存储文件内容和版本信息,不包含本地系统的权限属性,Windows的attrib权限设置不会同步到Github,也无法通过Github调整部署到Vercel后的服务器文件权限。

  • 报错核心原因是Vercel运行环境为只读文件系统:Vercel的Serverless Functions运行时,仅/tmp目录可写,当前SQLite数据库文件放在instance目录,部署后该目录属于只读区域,无法写入。

  • 解决方案:

    1. 修改Flask应用的数据库路径,将SQLite文件指向Vercel的可写目录/tmp。示例代码:
      import os
      from flask_sqlalchemy import SQLAlchemy
      
      app = Flask(__name__)
      # 替换原有数据库路径配置
      app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:////tmp/{os.environ.get("DB_NAME", "app.db")}'
      db = SQLAlchemy(app)
      
    2. 注意:Vercel的/tmp目录是临时存储,函数执行结束后数据会被清除,重启或新请求无法访问之前写入的数据。若需持久化存储,建议改用云数据库(如PostgreSQL、MySQL),或使用Vercel官方Storage服务(如Vercel KV、Postgres)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:15:37