I've a little problem with Flask-SQLAlchemy
Saphi8
Posted on April 8, 2024
Problem solved !
I'm currently in highschool, and we have a project : create a website. We're three and my part is the backend, with Flask in python.It is the first time I try to do something like that. The first thing I need to do is create an API for new users, but I can't write things on the database.
Here is the final error :
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', "{'': ['', '']}")]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
Here the part where I Initialize the database : (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)
What my API look like : (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)
And what r.user.login look like: (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"}),)
Here's what I tried :
-> Giving rwx permissions for everyone
-> Install sqlite with sudo apt install sqlite3 Nothing worked, and I didn't found anything else to help me
Note that I’m trying this out in a VM (running Debian 12 with KDE), and that the files of the project are taken from my computer (and accessed through the shared files functionality of VirtualBox).
Posted on April 8, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.