首页 > 解决方案 > 尝试将变量插入数据库时​​不断出错

问题描述

按下按钮时尝试将列表的每隔一个元素插入数据库但不断出错

testing=connect(database='test.db')
    test_db=testing.cursor()
    test_db.execute('DELETE FROM test_table;')
    for zz in range(0, len(list), 2):
        print(titles[zz])
        query='INSERT INTO test_table (test_name) VALUES('+list[zz]+')'
        query2='INSERT INTO test_table (test_date) VALUES('+list2[zz]+')'
        test_db.execute(query)
        test_db.execute(query2)

这是我收到的错误

Exception in Tkinter callback
Traceback (most recent call last):

sqlite3.OperationalError: unrecognized token: "3D"

标签: pythonsqlite

解决方案


首先,您直接在查询字符串中写入参数值,这被认为是一种不好的做法。这里正确的方法是使用参数化查询。接下来,当您使用 2 个插入语句时,您将把每部电影分成 2 个数据库行,不可能将标题和日期联系起来,这很奇怪。最后,也是导致错误的原因,SQL 字符串必须用单引号括起来,这是您未能做到的。

因此,该错误的直接修复方法是:

    query="INSERT INTO test_table (test_name) VALUES('"+titles[zz]+"')"
    query2="INSERT INTO test_table (test_date) VALUES('"+dates[zz]+"')"

但是恕我直言,您应该做的是,使用简单的参数化查询:

    query='INSERT INTO test_table (test_name, test_date) VALUES(?,?)'
    test_db.execute(query, (titles[zz], dates[zz]))

甚至更好的是,只为所有插入准备一次查询:

test_db.execute('DELETE FROM test_table;')
query='INSERT INTO test_table (test_name, test_date) VALUES(?,?)'
test_db.execute-many(query, [(titles[zz], dates[zz])
                                      for zz in range(0, len(titles), 2)]

推荐阅读