无法删除数据库sqlite/sqlalchemy中的行

2g32fytz  于 2023-05-18  发布在  SQLite
关注(0)|答案(1)|浏览(126)

我正在学习数据库,并试图注入sql数据库的网站。我有从网站上删除电影卡的按钮。查看选择功能!但是当我运行我的代码时,它并没有从数据库中删除行,为什么?我试图阅读文档并询问chatgpt,但它并没有给我任何可能性来解决这个问题......抱歉问了个愚蠢的问题

from flask import Flask, render_template, redirect, url_for, request
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, IntegerField, FloatField, URLField
from wtforms.validators import DataRequired, NumberRange, URL
import requests
from sqlalchemy import update

app = Flask(__name__)
app.config['SECRET_KEY'] = '8BYkEfBA6O6donzWlSihBXox7C0sKR6b'
Bootstrap(app)
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///film-rating.db"
db = SQLAlchemy(app)

class AddForm(FlaskForm):
    title = StringField("Title", validators=[DataRequired()])
    year = IntegerField("Year", validators=[NumberRange()])
    description = StringField("Description", validators=[DataRequired()])
    rating = FloatField("Rating", validators=[NumberRange()])
    ranking = IntegerField("Ranking", validators=[NumberRange()])
    review = StringField("Review", validators=[DataRequired()])
    img_url = URLField("Image URL", validators=[URL()])
    submit = SubmitField("Submit data")

class EditForm(FlaskForm):
    rating = FloatField("Your rating e.g 7.8/10", validators=[NumberRange()])
    review = StringField("Your review", validators=[DataRequired()])
    submit = SubmitField("Submit your changes")

class FilmForm(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(250), nullable=False)
    year = db.Column(db.Integer, nullable=False)
    description = db.Column(db.String, nullable=False)
    rating = db.Column(db.Float, nullable=False)
    ranking = db.Column(db.Integer, nullable=False)
    review = db.Column(db.String(250), nullable=False)
    image_url = db.Column(db.String, nullable=False)

    def __init__(self, title, year, description, rating, ranking, review, image_url):
        self.title = title
        self.year = year
        self.description = description
        self.rating = rating
        self.ranking = ranking
        self.review = review
        self.image_url = image_url

@app.route("/")
def home():
    all_films = FilmForm.query.all()
    return render_template("index.html", all_films=all_films)

@app.route('/add', methods=["POST", "GET"])
def add():
    form = AddForm()
    if form.validate_on_submit():
        title = request.form.get("title")
        year = request.form.get("year")
        description = request.form.get("description")
        rating = request.form.get("rating")
        ranking = request.form.get("ranking")
        review = request.form.get("review")
        img_url = request.form.get("img_url")
        return redirect(url_for("home"))
    return render_template("add.html", form=form)

@app.route('/edit', methods=["GET", "POST"])
def edit():
    form = EditForm()
    if form.validate_on_submit():
        new_rating = request.form.get("rating")
        new_review = request.form.get("review")
        with app.app_context():
            movie_id = 1
            movie = FilmForm.query.get(movie_id)
            movie.rating = new_rating
            movie.review = new_review
            db.session.commit()
        return redirect(url_for("home"))
    return render_template("edit.html", form=form)

@app.route('/select')
def select():
    movie_id = request.args.get('movie_id')
    movie = FilmForm.query.get(movie_id)
    db.session.delete(movie)
    return redirect(url_for("home"))

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(debug=True
yzxexxkh

yzxexxkh1#

首先,你的FilmForm.__init__()是没有意义的:它并没有增加任何已经无法完成的事情。另外,我不知道这是不是真实的代码,或者只是为了举例,我也不知道你没有调用super().__init__()是不是一个错误。
您没有显示如何创建会话。你有autocommit=True吗?如果没有,那么你的session.commit()调用在哪里?如果你没有调用这个函数,那么你删除的内容就不会被持久化.(另外,我看不出你实际上在哪里add任何数据库)
您应该在每个http请求的开头创建一个scoped_session,并在每个http请求的结尾提交/回滚。或者,您应该使用autocommit=True

相关问题