繁体   English   中英

Flask SQLAlchemy 操作错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM