SQLite3 Python:ExecuteMay选择
我试图使用executemany函数将表中的所有行放在一行中,并使用一些WHERE约束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'),
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