为啥不将其添加到数据库中?

Posted

技术标签:

【中文标题】为啥不将其添加到数据库中?【英文标题】: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 参数之前的: 【参考方案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 249,execute() 的返回值是未定义的,并且可能因数据库/库而异)。

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

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

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

【讨论】:

以上是关于为啥不将其添加到数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 - 如何初始化对象但不将其添加到持久存储?

为啥不将 FirebaseDatabase 引用中的所有数据都添加到 ArrayList<String> 中?

测试 WPF 控件而不将其添加到窗口

如何在不将其添加到子视图的情况下截取 uiview?

SwiftUI:将动画添加到 Picker 而不将其添加到值中

如何计算GeoJSON的边界而不将其添加到地图中