[英]Flask SQLAlchemy OperationalError
我正在创建我的第一个 Flask 项目。 项目的第一部分显然是登录部分。 我用 html 制作了注册和登录页面。 然后我写了项目的 flask 部分。 代码如下,分在main.py文件中
from flask import Flask, render_template, redirect, url_for, session
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
from os import path
from flask_login import LoginManager
db = SQLAlchemy()
DB_NAME = "database.db"
def create_app():
app = Flask(__name__,static_url_path='/static')
app.secret_key = "referendumKey"
app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
db.init_app(app)
#importation of all blueprints created
from .auth import auth
from .views import views
app.register_blueprint(auth, url_prefix='/')
app.register_blueprint(views, url_prefix='/')
#model import
from .models import Refs, User
create_database(app)
login_manager = LoginManager()
login_manager.login_view = 'auth.login'
login_manager.init_app(app)
@login_manager.user_loader
def load_user(id):
return User.query.get(int(id))
return app
#If you haven't already created a database, it will be created
def create_database(app):
if not path.exists('website/' + DB_NAME):
db.create_all(app=app)
print('Created Database!')
然后,认证文件(auth.py)
from flask import Blueprint, render_template, session, redirect, url_for, request, flash
from .models import User
from . import db
from flask_login import login_user, login_required, logout_user, current_user
auth = Blueprint("auth", __name__)
@auth.route("/login", methods=["GET", "POST"])
def login():
if request.method == 'POST':
name =request.form.get("username")
psw =request.form.get("psw")
user = User.query.filter_by(name=name).first()
if user:
if psw == user.password:
flash("Logged succesfully", category="success")
login_user(user, remember=True)
return redirect(url_for("views.home"))
else:
flash("Incorrect password", category="error")
else:
flash("Unexistent user", category="error")
return render_template("login.html", user=current_user)
@auth.route("/signup", methods=["GET", "POST"])
def signup():
if request.method=="POST":
username=request.form.get('username')
psw1=request.form.get('psw1')
psw2=request.form.get('psw2')
user = User.query.filter_by(name=username).first()
if user:
flash("Username already exist", category="error")
elif len(username)<3:
flash("Username too short", category="error")
elif psw1!=psw2:
flash("Passwords are different", category="error")
else:
new_user = User(name=username, password=psw1)
db.session.add(new_user)
db.session.commit()
login_user(new_user, remember=True)
flash("Account created", category="Success")
return redirect(url_for(views.home))
return render_template("signup.html", user=current_user)
@auth.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('auth.login'))
而且,views.py 文件应该让人们看到带有内容的主页
from flask import Blueprint, render_template, request, flash, jsonify
from flask_login import login_required, current_user
from . import db
views = Blueprint('views', __name__)
@views.route("/")
@views.route("/home")
@login_required
def home():
return render_template("home.html")
为了存储数据类型,我在以下代码中使用了模型
from . import db
from flask_login import UserMixin
from sqlalchemy.sql import func
"""
Definire la classe che identidica un Referendum, inserendovi:
id di colonna, la domanda, la prima e la seconda risposta
possibili, i voti che hanno ricevuto, chi ha votato già, l'id
dell'utente che possiede il ref
"""
class Refs(db.Model):
id = db.Column(db.Integer,primary_key=True)
question = db.Column(db.String(200))
fAnsw = db.Column(db.String(200))
sAnsw = db.Column(db.String(200))
fVote = db.Column(db.Integer, default=0)
sVote = db.Column(db.Integer, default=0)
voters = db.Column(db.ARRAY(db.Integer))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
"""
Definire la classe utente inserendo il suo nome, la sua
password, e tutti i Referendum da lui creato
"""
class User(db.Model,UserMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(150), unique=True)
password = db.Column(db.String(150))
refs = db.relationship('Refs')
现在,有一个问题。 如果我尝试创建新帐户或登录,则会出现错误。 错误如下。
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: user
[SQL: SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password
FROM user
WHERE user.name = ?
LIMIT ? OFFSET ?]
[parameters: ('sadas', 1, 0)]
(Background on this error at: http://sqlalche.me/e/14/e3q8)
它显示了代码的以下部分:
user = User.query.filter_by(name=name).first()
我猜问题出在数据库的 model 中,因为它显示了 SQLAlchemy 错误。 可能我使用了不正确的语法。 我阅读了很多 github 存储库,以及官方文档( https://docs.sqlalchemy.org/en/14/ ),我认为编译器可以理解,但我认为我可以理解链接它正确。 该错误甚至可能出现在 flask_login API 用法中,但阅读错误和文档我猜不是。 有人能帮助我吗? 谢谢
不建议在运行时创建数据库。 Flask 应用程序需要在启动时连接到数据库。 您可以在运行时创建表。
我怀疑您在某处创建了一个空数据库。 所以数据库文件可能存在但不包含表。 实际上,您可能在不同的位置有两个挥之不去的 SQLite 文件。 仔细检查您的目录。
考虑这段代码:
DB_NAME = "database.db"
def create_app():
app = Flask(__name__,static_url_path='/static')
app.secret_key = "referendumKey"
app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}'
这将在“当前”目录(无论它是什么)中创建一个 SQLite 文件。
在其他地方指定相对路径 - 同样,不清楚最终路径是什么,但很可能与上面的不同:
def create_database(app):
if not path.exists('website/' + DB_NAME):
db.create_all(app=app)
print('Created Database!')
解决方法是为您的数据库使用完全限定的路径,而不是相对路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.