【问题标题】:Insert query is executed but data is not added into table执行插入查询但未将数据添加到表中
【发布时间】:2020-06-29 06:46:55
【问题描述】:

我正在尝试从 Flask 应用程序在 heroku postgres db 上的表中插入数据。查询正在执行,但表格上没有显示结果。

如果我犯了任何错误,请告诉我。 谢谢!

路线文件(书页[帖子]):

import os

from flask import Blueprint, render_template, request, flash, redirect, url_for
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from flask_login import login_required, current_user

main = Blueprint('main', __name__)

engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))


@main.route("/")
def index():
    return render_template('index.html')


@main.route("/home")
@login_required
def home():
    book = ""
    return render_template('home.html', name=current_user.name, book=book)


@main.route("/home", methods=['POST'])
@login_required
def home_post():
    isbn = '%' + request.form.get('isbn') + '%'
    title = '%' + request.form.get('title') + '%'
    author = '%' + request.form.get('author') + '%'
    if isbn is None and title is None and author is None:
        flash('Please enter atleast one info of book')
    books = []
    if isbn is not None:
        q1 = db.execute("SELECT title FROM bookinfo WHERE isbn LIKE (:isbn)", {"isbn": isbn}).fetchall()
        if len(q1) < 4999:
            books.append(q1)
    if title is not None:
        q2 = db.execute("SELECT title FROM bookinfo WHERE title LIKE (:title)", {"title": title}).fetchall()
        if len(q2) < 4999:
            books.append(q2)
    if author is not None:
        q3 = db.execute("SELECT title FROM bookinfo WHERE author LIKE (:author)", {"author": author}).fetchall()
        if len(q3) < 4999:
            books.append(q3)
    if not books:
        flash('No book found with given info')
    else:
        return render_template('home.html', book=books)
    return redirect(url_for('main.home', name=current_user.name))


@main.route("/bookpage")
def bookpage():
    data = []
    review_data = []
    return render_template('bookpage.html', data=data, review=review_data)


@main.route("/bookpage", methods=['POST'])
def bookpage_post():
    title = request.form.get('title')
    data = []
    review_data = []
    rating = request.form.get('rating')
    reviews = request.form.get('review')
    bk_title = request.form.get('bk_title')
    if request.method == 'POST':
        if request.form.get('submit') == 'Get Details':
            if title is not None:
                q1 = db.execute("SELECT isbn, title, author, year FROM bookinfo WHERE title = (:title)",
                                {"title": title}).fetchall()
                q2 = db.execute("SELECT rating, review FROM reviews WHERE title = (:title)",
                                {"title": title}).fetchall()
                data.append(q1)
                if q2 is not None:
                    review_data.append(q2)
                    if len(review_data[0]) == 0:
                        review_data.clear()
                        review_data.append([('No Rating', 'No Reviews')])
        if request.form.get('submit') == 'Submit Review':
            if rating is not None and reviews is not None:
                db.execute("INSERT INTO reviews (title, rating, review) VALUES (:title, :rating, :review)",
                           {"title": bk_title, "rating": rating, "review": reviews})
                flash('Review Submitted')
            else:
                flash('Error')
    return render_template('bookpage.html', data=data, review=review_data, rating=rating, reviews=reviews)

html页面:

{% extends 'index.html' %}

{% block content %}
<div class="box">
    {% with messages = get_flashed_messages() %}
    {% if messages %}
    <div class="alert alert-primary" role="alert">
        {{ messages[0] }}
    </div>
    {% endif %}
    {% endwith %}
    <form action="/bookpage" method="POST">
        <input type="text" id="result" name="title" readonly>
        <input type="submit" value="Get Details" name="submit"><br><br>
        <br><br>
        {% for d in data[0] %}
        <h2>ISBN: </h2>
        <h3>{{ d[0] }}</h3><br>
        <h2>Title: </h2>
        <h3>{{ d[1] }}</h3><br>
        <h2>Author: </h2>
        <h3>{{ d[2] }}</h3><br>
        <h2>Year: </h2>
        <h3>{{ d[3] }}</h3><br>
        <h2>Rating: </h2>
        <h3>{{ review[0][0][0] }}</h3><br>
        <h2>Reviews: </h2>
        <h3>{{ review[0][0][1] }}</h3><br>
        {% endfor %}
    </form>
    <form action="/bookpage" method="POST" id="review">
        <h5 align="left">Review:</h5>
        <input type="range" min="1" max="5" value="3" name="rating" class="slider" id="myRange"><br>
        <h6 align="left">&nbsp;1&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;2&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;3&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;4&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;5</h6>
        <input id="result1" name="bk_title">
        <textarea rows="4" cols="50" name="review" form="review"></textarea>
        <input type="submit" value="Submit Review" name="submit">
    </form>
</div>
{% endblock %}

提交查询后的输出: html page 错误: table view

【问题讨论】:

  • 也许你错过了db.commit()

标签: python sql postgresql flask


【解决方案1】:

您应该只创建 one method for one route 。你正在创建2 methods for route /bookpage

遵循的标准:

如果您想为不同类型的请求路由/bookpage,即GET, POST, etc,您可以为该路由定义一个单一方法并使用if-else conditions 处理当它是GET request-type 时要执行什么逻辑以及要执行什么逻辑在POST request-type时执行

【讨论】:

    猜你喜欢
    • 2017-01-29
    • 2013-04-15
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    相关资源
    最近更新 更多