AttributeError:“作用域_会话”对象没有属性“get”

2024-05-18 13:57:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从数据库中删除数据,但我的web应用程序返回以下错误:

File "C:\Users\q\Pyc\Flask\basic_of_flask\SQL Database with flask\Database in view\adoption_sit.py", line 78, in  del_pup

pup = db.session.get(id)

AttributeError: 'scoped_session' object has no attribute 'get'

看看下面我的代码

import os
from flask import Flask, redirect, render_template, url_for
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from form import AddForm, DelForm

app = Flask(__name__)

app.config['SECRET_KEY'] = 'mysecretkey'

#######################################
#### SQL DATABASE SECTION #############
#######################################

basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
Migrate(app, db)


########################################
######## Models ########################
########################################

class Puppy(db.Model):
    __tablename__ = 'puppies'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text)

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return f"Puppy name is {self.name}."


#############################################
##### VIEW FUNCTIONS -- HAVE FORM ###########
#############################################

@app.route('/')
def index():
    return render_template('home.html')


@app.route('/add', methods=['GET', 'POST'])
def add_pup():
    form = AddForm()

    if form.validate_on_submit():
        name = form.name.data
        new_puppy = Puppy(name)
        db.session.add(new_puppy)
        db.session.commit()

        return redirect(url_for('list_pup'))

    return render_template('add.html', form=form)


@app.route('/list_pup')
def list_pup():
    puppies = Puppy.query.all()
    return render_template('list.html', puppies=puppies)


@app.route('/delete', methods=['GET', 'POST'])
def del_pup():
    form = DelForm()

    if form.validate_on_submit():
        id = form.id.data
        pup = db.session.get(id)
        db.session.delete(pup)
        db.session.commit()
        return redirect(url_for('list_pup'))

    return render_template('delete.html', form=form)

db.create_all()

if __name__ == '__main__':
    app.run(debug=True)

这是我的form.py文件

# form.py
from flask_wtf import FlaskForm
from wtforms import SubmitField, StringField, IntegerField


class AddForm(FlaskForm):
    name = StringField('Name of puppy:')
    submit = SubmitField('Submit puppy')


class DelForm(FlaskForm):
    id = IntegerField("Id number of puppy to be remove:")
    submit = SubmitField("Remove puppy")


Tags: namefromimportformidappflaskdb
1条回答
网友
1楼 · 发布于 2024-05-18 13:57:56

我猜你在del_pup()函数中做的事情是错误的

[..]
    pup = db.session.get(id)  # here

您需要使用给定的id获取Puppy对象,如下所示:

@app.route('/delete', methods=['GET', 'POST'])
def del_pup():
    form = DelForm()

    if form.validate_on_submit():
        id = form.id.data

        # pup = db.session.get(id)  # wrong way
        pup = Puppy.query.filter_by(id=id).first()`  # here

        db.session.delete(pup)
        db.session.commit()
        return redirect(url_for('list_pup'))

    return render_template('delete.html', form=form)

相关问题 更多 >

    热门问题