SQLite3 Python:ExecuteMay选择

SQLite3 Python:ExecuteMay选择,python,select,sqlite,executemany,Python,Select,Sqlite,Executemany,我试图使用executemany函数将表中的所有行放在一行中,并使用一些WHERE约束 import sqlite3 con = sqlite3.connect('test.db') cur = con.cursor() cur.execute('CREATE TABLE IF NOT EXISTS Genre (id INTEGER PRIMARY KEY, genre TEXT NOT NULL)') values = [ (None, 'action'),

我试图使用executemany函数将表中的所有行放在一行中,并使用一些WHERE约束

import sqlite3

con = sqlite3.connect('test.db')
cur = con.cursor()

cur.execute('CREATE TABLE IF NOT EXISTS Genre (id INTEGER PRIMARY KEY, genre TEXT NOT NULL)')

values = [
        (None, 'action'),
        (None, 'adventure'),
        (None, 'comedy'),
        ]


cur.executemany('INSERT INTO Genre VALUES(?, ?)', values)

ids=[1,2]

cur.executemany('SELECT * FROM Genre WHERE id=?', ids)

rows = cur.fetchall()
print rows
错误 使用
execute()
执行返回数据的查询

您必须在(id1、id2、id3)where子句中使用循环或

cur.execute('SELECT * FROM Genre WHERE id in ({0})'.format(', '.join('?' for _ in ids)), ids)

上述表达式为
ids
中的每个项目插入一个单独的
占位符(用逗号分隔)。

您收到的错误消息很简单,
您无法在executemany()中执行SELECT语句。

只需将
executemany
更改为执行:

ids=[1,2]
for id in ids:
    cur.execute('SELECT * FROM Genre WHERE id=?', id)
    rows = cur.fetchall()
    print rows

谢谢Martijin,我不知道IN子句,它帮助很大。cursor.executemany方法是通过反复调用cursor.execute来实现的吗?@shadow0359:no,
cursor.executemany()
实际上是通过将参数放入列表,然后执行
cursor.executemany()
来实现的。请参阅(
execute()
executemany()
之间的唯一区别是后者的
multiple
设置为1)。@MasonSchmidgall它不会创建注入漏洞。它专门生成阻止SQL注入的SQL参数。例如,
ids=(42,“Robert”;DROP TABLE Students;--“,)
生成查询字符串
SELECT*FROM Genre,其中id in(?,)
,使用2个SQL参数执行,数据库安全地将其引用为值。在任何情况下,
ids[1]
都不会作为SQL命令执行。@MasonSchmidgall请仔细阅读此处插入的文本。如果将
ids
变量的内容插入到查询字符串中,则是,将存在漏洞,但这不是此代码所做的。我们只需使用序列的长度来生成大量的
参数占位符,并将它们放入查询中。
ids
值本身永远不会被此代码插入,而是作为参数值交给数据库。这也有帮助,但Martijin的更适合我的情况,谢谢您的帮助。这是否涉及到对每个id重新分析查询?或者python-sqlite3会缓存它们吗?@rsaxvc根据“sqlite3模块内部使用语句缓存以避免SQL解析开销。”对我来说,这意味着它不会每次都重新分析查询。
ids=[1,2]
for id in ids:
    cur.execute('SELECT * FROM Genre WHERE id=?', id)
    rows = cur.fetchall()
    print rows