在python中将多个变量传递给SQLite查询

时间:2019-07-19 14:06:50

标签: python sql sqlite

我在python代码中有一个SQLite查询(如下所示),该查询使用版本号作为“字符串”,我必须将这些版本(以下查询中的“ 1.2.7”和“ 3.7.10”)作为变量传递(v1,v2)。

我成功使用了'?'用于为“名称”属性传递一个变量(pname)。我不确定如何在多次出现的SQLite查询中传递多个变量。

    c.execute( """
    select name,version from packages
    where name = ? and 
    1000000 * replace(version, '.', 'x') +
    1000 * replace(substr(version, instr(version, '.') + 1), '.', 'x') +
    replace(version, '.', '000') % 1000 
    between 
    1000000 * replace('1.2.7', '.', 'x') +
    1000 * replace(substr('1.2.7', instr('1.2.7', '.') + 1), '.', 'x') +
    replace('1.2.7', '.', '000') % 1000
    and
    1000000 * replace('3.7.10', '.', 'x') +
    1000 * replace(substr('3.7.10', instr('3.7.10', '.') + 1), '.', 'x') +
    replace('3.7.10', '.', '000') % 1000
    """ ,(pname,))

类似的东西:

    c.execute( """
    select name,version from packages
    where name = ? and 
    1000000 * replace(version, '.', 'x') +
    1000 * replace(substr(version, instr(version, '.') + 1), '.', 'x') +
    replace(version, '.', '000') % 1000 
    between 
    1000000 * replace(V1, '.', 'x') +
    1000 * replace(substr(V1, instr(V1, '.') + 1), '.', 'x') +
    replace(V1, '.', '000') % 1000
    and
    1000000 * replace(V2, '.', 'x') +
    1000 * replace(substr(V2, instr(V2, '.') + 1), '.', 'x') +
    replace(V2, '.', '000') % 1000
    """ ,(pname,))

2 个答案:

答案 0 :(得分:0)

您可以尝试的一种解决方案是按照sqlite3 for python上的文档使用字符串替换

v1 = '1.2.7'
v2 = '3.7.10'

c.execute( """
  select name,version from packages
  where name = ? and 
  1000000 * replace(version, '.', 'x') +
  1000 * replace(substr(version, instr(version, '.') + 1), '.', 'x') +
  replace(version, '.', '000') % 1000 
  between 
  1000000 * replace(?2, '.', 'x') +
  1000 * replace(substr(?2, instr(?2, '.') + 1), '.', 'x') +
  replace(?, '.', '000') % 1000
  and
  1000000 * replace(?3, '.', 'x') +
  1000 * replace(substr(?3, instr(?3, '.') + 1), '.', 'x') +
  replace(?, '.', '000') % 1000
  """ ,(pname,v1,v2))

因此,只需将所有参数替换为?,并在最后将值的填充列表作为数据传递。

答案 1 :(得分:0)

使用显式编号的参数(?1引用第一个绑定值,?2引用第二个绑定值,依此类推):

c.execute( """
  select name,version from packages
  where name = ?1 and 
  1000000 * replace(version, '.', 'x') +
  1000 * replace(substr(version, instr(version, '.') + 1), '.', 'x') +
  replace(version, '.', '000') % 1000 
  between 
  1000000 * replace(?2, '.', 'x') +
  1000 * replace(substr(?2, instr(?2, '.') + 1), '.', 'x') +
  replace(?2, '.', '000') % 1000
  and
  1000000 * replace(?3, '.', 'x') +
  1000 * replace(substr(?3, instr(?3, '.') + 1), '.', 'x') +
  replace(?3, '.', '000') % 1000
""" ,(pname,v1,v2))

您也可以使用命名参数而不是编号参数,但是我不确定如何在Python端使用它们。