【问题标题】:Using sqlite3 DB-API multiple parameter substitution in SELECT statements在 SELECT 语句中使用 sqlite3 DB-API 多参数替换
【发布时间】:2019-03-09 01:03:15
【问题描述】:

给定:

letters = list("abc")

我想获取characters 中包含letters 中任何字母的所有行,这些行包含在其c 列中。我可以做到这一点,但只能使用 python 的字符串操作,考虑到它的漏洞,这是不合适的。

理想情况下(我的示例已简化)这将使用 GLOB 子句。

例如

>>> cur.execute(**the statement here**)
>>> print(cur.fetchall())
>>> [('a',), ('b',), ('c',)]

创建数据库:

import sqlite3
import string

def char_generator():
    for c in string.ascii_lowercase:
        yield (c,)

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table characters(c)")

cur.executemany("insert into characters(c) values (?)", char_generator())

【问题讨论】:

  • 我不认为这是一个骗局,但this question 可能会有所帮助。

标签: python sqlite


【解决方案1】:

也许这个示例可以帮助你。

import sqlite3
import string

def char_generator():
    for c in string.ascii_lowercase:
        yield (c,)


con = sqlite3.connect(":memory:")

def initdb():
    cur = con.cursor()
    cur.execute("create table characters(c)")

    cur.executemany("insert into characters(c) values (?)", char_generator())

def search(value):
    values = [c for c in value]
    cur = con.cursor()
    cur.execute('SELECT * FROM characters WHERE c IN ({0})'.format(','.join(['?' for c in values])), values)
    return cur.fetchall()


if __name__ == '__main__':
    initdb()
    print(search("abcde"))

此代码使用参数。所以你不必担心 SQL 注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多