首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >烧瓶SQLAlchemy OperationalError

烧瓶SQLAlchemy OperationalError
EN

Stack Overflow用户
提问于 2021-06-07 20:07:05
回答 2查看 227关注 0票数 0

我正在创建我的第一个水瓶项目。项目的第一部分显然是登录部分。我用html页面注册和登录。然后我写了这个项目的烧瓶部分。代码如下,在main.py文件中划分

代码语言:javascript
复制
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)

代码语言:javascript
复制
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文件,这应该让人们看到主页的内容

代码语言:javascript
复制
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")

为了存储数据类型,我在下面的代码中使用了模型

代码语言:javascript
复制
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')

现在有个问题。如果我尝试创建一个新帐户,或者登录,就会出现错误。错误如下。

代码语言:javascript
复制
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)

它显示了代码的以下部分:

代码语言:javascript
复制
user = User.query.filter_by(name=name).first()

我想问题在数据库的模型中,因为它显示了一个SQLAlchemy错误。可能我使用了错误的语法。我读了很多github存储库,也读过官方文档(https://docs.sqlalchemy.org/en/14/),甚至是编译器重新引用的链接,但我无法理解,我认为我写的很正确。这个错误甚至可以出现在flask_login API的使用中,但是阅读错误和文档--我想不是。--有人能帮我吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-08 09:25:26

在运行时创建数据库是不可取的。烧瓶应用程序需要在开始时连接到数据库。您可以在运行时创建表。

票数 1
EN

Stack Overflow用户

发布于 2021-06-08 18:41:46

我怀疑你在某个地方创建了一个空数据库。因此DB文件可能存在,但不包含任何表。实际上,您可能在不同的位置有两个挥之不去的SQLite文件。仔细检查你的目录。

请考虑以下代码:

代码语言:javascript
复制
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文件(不管它是什么)。

在其他地方,您指定了一个相对路径--同样,还不清楚最终路径是什么,但很可能与上面的不同:

代码语言:javascript
复制
def create_database(app):
    if not path.exists('website/' + DB_NAME):
        db.create_all(app=app)
        print('Created Database!')

修复方法是为DB使用完全限定的路径,而不是相对路径。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67878081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档