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会在目录内生成临时文件)。以下是具体解决步骤:
调整共享目录挂载权限
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
- 先卸载共享目录(假设挂载路径为
确保数据库目录有写入权限
给数据库所在目录赋予写入权限:sudo chown -R $USER:$USER /home/ubuntu/thoth-edu/database或者临时开放全权限(测试用,不推荐长期使用):
sudo chmod 777 /home/ubuntu/thoth-edu/database迁移数据库到虚拟机本地目录(推荐)
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
- 修改
检查Flask运行用户权限
如果用gunicorn等服务器运行Flask,确保运行进程的用户对数据库目录有写入权限,避免用root用户运行。
内容的提问来源于stack exchange,提问作者Saphi 8
相关产品推荐
相关产品推荐

