我想使用此代码。
使用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搜索找不到它....
帮助我..谢谢你的阅读。
答案 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'))
您不能将参数替换用于字段名称。