如何使用sqlite查询选择使用传递变量?

时间:2017-07-31 04:15:22

标签: sqlite

我想使用此代码。

使用python2 sqlte3

CON = sq.connect()

CUR = con.cursor()

而不是代码

cur.execute(“SELECT id, (6371 * acos(cos(弧度( 37 ))* cos(弧度(lat))* cos(弧度(lng) - 弧度( 127 ))+ sin(弧度( 37 ))* sin(弧度(纬度)))) 距离  从具有距离的TEST_TABLE< 5
ORDER BY距离LIMIT 0,5;“)

我想改变它。

VAL1 =输入()

val2的输入=()

cur.execute(“SELECT id, (6371 * acos(cos(弧度( val2 ))* cos(弧度(纬度))* cos(弧度(lng) - 弧度( val1 ))+ sin(弧度( val2 ))* sin(弧度(纬度)))) 距离  从具有距离的TEST_TABLE< 5
ORDER BY距离LIMIT 0,5;“)

我怎样才能通过val1,val2?

像这样

cur.execute(“select * from tablename,其中a =?和b =?”,('a','b'))

我试过这段代码

cur.execute(“select?from tablename”,('a'))

这会导致语法错误。我也用Google搜索找不到它....

帮助我..谢谢你的阅读。

1 个答案:

答案 0 :(得分:0)

假设cos,sin等与你的sqlite3副本一起工作,你需要像这样做

cur.execute("SELECT id, ( 6371 * acos( cos( radians(?) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance FROM TEST_TABLE WHERE distance < 5
ORDER BY distance LIMIT 0 , 5;", (val2, val1, val2))

我说“类似”,因为你的原始SQL不起作用。它在条件中有HAVING,只有在您有GROUP BY子句时才有用。所以WHERE是要走的路。

sqlite3允许您在WHERE子句中使用计算字段的名称,这非常有趣。有些数据库引擎不允许这样做,并让你在where子句中重新计算它,因为......我不知道为什么。

所以这是一个最小的工作片段,说明了如何进行多参数替换:

import sqlite3
conn = sqlite3.connect('example2.db')

c = conn.cursor()

c.execute ('''CREATE TABLE test_table ( id number, distance number, lat number, lng number ) ''')
c.execute ("INSERT INTO test_table VALUES (1, 1, -36.862, 174.725)")
c.execute ("INSERT INTO test_table VALUES (6, 6, -41.244, 174.621)")

conn.commit()


val1 = 3
val2 = 5

# this is the line you're most interested in:
c.execute("SELECT id, lat + ? x, lng + ?, lat * lng * ? distance FROM TEST_TABLE where distance < 5 ORDER BY distance LIMIT 0 , 5;", (val2, val1, val2) )

print c.fetchone()

还有一件事 - 这不起作用:

cur.execute("select ? from tablename ",('a'))

您不能将参数替换用于字段名称。