【问题标题】:Cannot insert row using Flask and SQLAlchemy无法使用 Flask 和 SQLAlchemy 插入行
【发布时间】:2018-12-30 09:33:48
【问题描述】:

我在做 CS50 项目,目前的任务是创建一个注册页面。用户填写表格并按下按钮。所以它必须插入到我的 PostgreSQL 数据库中。但是当我填写表格并按“注册”时,我收到了这个错误:

StatementError: (sqlalchemy.exc.InvalidRequestError) A value is required for bind parameter u'surname' [SQL: u'INSERT INTO users (name, surrname, nickname, password) VALUES (%(name)s, %(surname)s,%(nickname)s, %(password)s'] [parameters: [{':password': u'', ':name': u'John', ':surname': u'Young', ':nickname': u'yolojohny1'}]] (Background on this error at: http://sqlalche.me/e/cd3x)

books.py

    import os

from flask import Flask, session, render_template, request
from flask_session import Session
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

app = Flask(__name__)

# Check for environment variable
if not os.getenv("DATABASE_URL"):
    raise RuntimeError("DATABASE_URL is not set")

# Configure session to use filesystem
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

# Set up database
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))


@app.route("/")
def index():
    return render_template("register.html")

@app.route('/register', methods=["POST"])
def register():
    "REGISTRATION PROCESS"

    # Get form information
    name = request.form.get("name")
    surname = request.form.get("surname")
    nickname = request.form.get("nickname")
    password = request.form.get("password")


    db.execute("INSERT INTO users (name, surrname, nickname, password) VALUES (:name, :surname,"
               ":nickname, :password", {":name": name, ":surname": surname, ":nickname": nickname,
                                        ":password": password})

    db.commit()
    return render_template("success.html")

注册.html:

    {% extends "layout.html" %}

{% block title %}
  New User
{% endblock %}

{% block body %}

  <h1>Register new account</h1>

  <form action="{{ url_for('register') }}" method="post">

    <div class="form-group">
      <input class="form-control" name="name" placeholder="First Name">
    </div>

    <div class="form-group">
      <input class="form-control" name="surname" placeholder="Second Name">
    </div>

    <div class="form-group">
      <input class="form-control" name="nickname" placeholder="Nickname">
    </div>

    <div class="form-group">
      <input type="password" class="form-control" name="password" placeholder="Password">
    </div>

    <div class="formgroup">
      <button class="btn btn-primary">Create account!</button>
    </div>

  </form>

{% endblock %}

数据库:

  CREATE TABLE "users" (
   id SERIAL PRIMARY KEY,
   name VARCHAR NOT NULL,
   surrname VARCHAR NOT NULL,
   nickname VARCHAR NOT NULL,
   password VARCHAR NOT NULL
)

我该怎么办?我用谷歌搜索了这个错误,但没有任何帮助。

【问题讨论】:

    标签: python postgresql flask sqlalchemy


    【解决方案1】:

    你快到了。

    db.execute("INSERT INTO users (name, surrname, nickname, password) VALUES (:name, :surname, :nickname, :password", {":name": name, ":surname": surname, ":nickname": nickname, ":password": password})
    

    首先,这不会执行,因为您在 VALUES 列表后缺少右括号。因此,要执行该语句,我必须这样做:

    db.execute("INSERT INTO users (name, surrname, nickname, password) VALUES (:name, :surname, :nickname, :password)", {":name": name, ":surname": surname, ":nickname": nickname, ":password": password})
    

    我想这只是将信息翻译成问题的错字,但尽管如此。

    现在,冒号 (:),位于 SQL 语句中的参数名称之前,用于告诉 SQLAlchemy 该名称是绑定参数。 You can read more about it here.。您不需要将其包含在参数值dict 的键中,这就是您看到错误的原因。 SQLAlchemy 正在寻找一个名为 surname 的参数,但它在您提供的参数值中不存在,:surname 确实存在,但 ':surname' != 'surname' 因此找不到该参数的值。 这应该会让你越界:

    db.execute("INSERT INTO users (name, surrname, nickname, password) VALUES (:name, :surname, :nickname, :password)", {"name": name, "surname": surname, "nickname": nickname, "password": password})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2019-09-17
      • 1970-01-01
      • 2017-09-19
      • 2017-05-04
      • 2014-03-25
      • 2013-06-20
      相关资源
      最近更新 更多