我在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,))
答案 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端使用它们。