【问题标题】:Why Isn't This Getting Added to the Database?为什么不将其添加到数据库中?
【发布时间】:2016-12-08 09:42:02
【问题描述】:
elif request.method == "POST":
    post = request.form.get("question")
    option_1 = request.form.get("option1rename")
    option_2 = request.form.get("option2rename")
    db.execute("INSERT INTO posts (question, option1, option2) VALUES(:post, 
        option1, :option2)", post=post, option1=option_1, option2 = option_2)
    new_post = db.execute("SELECT id FROM posts WHERE question = :post", 
        post=post)
    print(new_post)

没有任何表单响应被添加到数据库中。我不能为
我的生活找出原因。有人可以帮忙吗?

【问题讨论】:

  • 这是烧瓶吗?如果是这样,您需要添加flask标签
  • 你需要提交你的交易:)
  • 什么意思?
  • AttributeError: 'SQL' 对象没有属性 'commit'
  • 您忘记了option1 参数之前的:

标签: python html sql database flask


【解决方案1】:

您需要将更改提交到数据库。请参阅有关设置会话的文档中的 this page。使用会话进行更改。那么就这么简单

session.add(your_change)
session.commit()

不使用会话,也可以尝试使用

db.execute('COMMIT')

但我建议设置会话。

【讨论】:

  • 我看到这个:RuntimeError: (sqlite3.OperationalError) cannot commit - no transaction is active [SQL: 'COMMIT'] 我在其他地方读到你不需要在 python 上提交?
  • 在 Python 中需要提交。查看文档中有关设置会话的页面。这很容易,应该足以解决这个问题。
【解决方案2】:

您正在使用 sqlite,因此您没有任何会话对象,如果您的请求参数和表字段都很好,execute() 方法将插入到表中

elif request.method == "POST":
    post = request.form.get("question")
    option_1 = request.form.get("option1rename")
    option_2 = request.form.get("option2rename")
    db.execute(
       """INSERT INTO posts (question, option1, option2) VALUES(%s, 
          %s, %s)"""%(post, option_1, option_2))
    new_post = db.execute("SELECT id FROM posts WHERE question=%s", post)
    print(new_post)

【讨论】:

  • 我很高兴看到我不需要提交,因为这是我第一次听说,但你的建议并没有解决它。不知道有什么问题,你还有什么建议吗?
  • 表单数据正确,没有错误——应该有吗?
  • 你可以尝试查询所有帖子SELECT * FROM posts 吗?
  • 实际上,我看到了:RuntimeError: This text() 结构没有定义名为 'option1' 的绑定参数
  • 你在做什么你得到RuntimeError?我很困惑
【解决方案3】:

db.execute(...) 不返回查询获取的行。 (事实上​​,根据PEP 249execute() 的返回值是未定义的,并且可能因数据库/库而异)。

要从SELECT 查询中取回行,您应该迭代游标:

cursor = db.cursor()
cursor.execute("SELECT id, name FROM ...")
for id, name in cursor:
    print (id, name)

(您也可以使用fetchone()fetchall() 和其他游标方法,但我发现使用for ... in ... 循环迭代游标通常是最简单的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2011-03-07
    • 2018-01-29
    • 2020-04-28
    相关资源
    最近更新 更多