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

Flask-SQLAlchemy无法写入SQLite数据库问题求助

问题:Flask+SQLite无法写入数据库,提示只读错误

背景

我是一名高中生,第一次参与网站开发项目,负责Python Flask后端开发。现在需要实现用户注册API,但无法向SQLite数据库写入数据。

报错信息

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) attempt to write a readonly database 
[SQL: INSERT INTO user (id, mdp, accents) VALUES (?, ?, ?)]
[parameters: ('saphi', '$2b$12$0McLhda54LEQtkg8QHxff.f.rJDADQ.sDsAGfvXHy8vhl4H9wE0y6', "{'': ['', '']}")]

相关代码

数据库初始化代码(路径:thoth-edu/thoth-edu/Backend/appInit.py)

from flask import Flask
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:////home/ubuntu/thoth-edu/database/data.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
CORS(
    app,
    resources={
        r"/.*": {"origins": ["https://thoth-edu.fr", "https://professeur.thoth-edu.fr"]}
    },
)
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.String, unique=True, nullable=False, primary_key=True)
    mdp = db.Column(db.String, nullable=False)
    accents = db.Column(db.String)


class Eval(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    cheminJSON = db.Column(db.String)
    cheminCSV = db.Column(db.String)
    idProf = db.Column(db.String, db.ForeignKey("user.id"), nullable=False)


class Acces(db.Model):
    id = db.Column(db.String, unique=True, nullable=False, primary_key=True)
    nom = db.Column(db.String, nullable=False)
    dateDeb = db.Column(db.String, nullable=False)
    dateFin = db.Column(db.String, nullable=False)
    modele = db.Column(db.String, db.ForeignKey("eval.id"), nullable=False)


with app.app_context():
    try:
        db.create_all()
        print("Tables created successfully.")
    except Exception as e:
        print("An error occurred while creating tables:", e)

API代码(路径:thoth-edu/thoth-edu/Backend/main.py)

# Import libraries
from flask import request
import json

# Import routes (and other modules)
import routes as r
from appInit import app

@app.route("/user/login", methods=["POST"])
def connexion():
    data = request.get_json()
    return r.user.login(data)

用户注册逻辑代码(路径:thoth-edu/thoth-edu/Backend/routes/user/login.py)

# Import libraries
from flask import jsonify
import sqlite3

# Import app
from appInit import db, User, bcrypt


def signup(data):
    # { "id" : "Bob" ; "mdp" : "mdp" ; "accents" : "é" }
    newUser = User(
        id=data["id"],
        mdp=bcrypt.generate_password_hash(data["mdp"]).decode("utf-8"),
        accents=str(data["accents"]),
    )

    user = User.query.filter_by(id=data["id"]).first()

    if user == None:
        db.session.add(newUser)
        db.session.commit()
        return (jsonify({"message": "True"}),)

    if user.id == data["id"]:
        return (jsonify({"message": "False"}),)

    db.session.add(newUser)
    db.session.commit()

    return (jsonify({"message": "True"}),)

已尝试的解决方法

  • 给所有用户设置rwx权限
  • 通过sudo apt install sqlite3安装sqlite3

环境说明

在Debian 12 KDE虚拟机中测试,项目文件通过VirtualBox共享功能从本地电脑获取。


解决方案

这个问题的核心是VirtualBox共享目录的权限限制,以及SQLite写入时不仅需要数据库文件权限,还需要数据库所在目录的写入权限(SQLite会在目录内生成临时文件)。以下是具体解决步骤:

  1. 调整共享目录挂载权限
    VirtualBox默认共享目录的挂载权限受限,需要修改挂载参数:

    • 先卸载共享目录(假设挂载路径为/home/ubuntu/thoth-edu):
      sudo umount /home/ubuntu/thoth-edu
      
    • 重新挂载并添加权限参数(替换1000为你的用户UID/GID,可通过id命令查看):
      sudo mount -t vboxsf thoth-edu /home/ubuntu/thoth-edu -o rw,uid=1000,gid=1000
      
    • 若要永久生效,编辑/etc/fstab添加一行:
      thoth-edu /home/ubuntu/thoth-edu vboxsf rw,uid=1000,gid=1000 0 0
      
  2. 确保数据库目录有写入权限
    给数据库所在目录赋予写入权限:

    sudo chown -R $USER:$USER /home/ubuntu/thoth-edu/database
    

    或者临时开放全权限(测试用,不推荐长期使用):

    sudo chmod 777 /home/ubuntu/thoth-edu/database
    
  3. 迁移数据库到虚拟机本地目录(推荐)
    VirtualBox共享目录存在性能和权限问题,建议将数据库移至虚拟机本地路径,比如/var/lib/thoth-edu/data.db:

    • 修改appInit.py中的数据库路径:
      app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:////var/lib/thoth-edu/data.db"
      
    • 创建目录并设置权限:
      sudo mkdir /var/lib/thoth-edu
      sudo chown $USER:$USER /var/lib/thoth-edu
      
  4. 检查Flask运行用户权限
    如果用gunicorn等服务器运行Flask,确保运行进程的用户对数据库目录有写入权限,避免用root用户运行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:20:11