1

我想在Flask-Peewee上获取这个自定义查询

SELECT A.* , haversine('34.0160',' -118.4925', A.lat, A.long, 'MILES') AS dist FROM merchant_details A HAVING haversine('34.0160', '-118.4925', A.lat, A.long, 'MILES') <6000

我尝试了以下代码,但没有成功,我得到“长”对象没有属性“fetchall”:

@app.route('/api/results/')
def results():
    db = connect_db()
    cur = db.execute("SELECT A.* , haversine('34.0160',' -118.4925', A.lat, A.long, 'MILES') AS dist FROM merchant_details A HAVING haversine('34.0160', '-118.4925', A.lat, A.long, 'MILES') <6000 LIMIT 1")
    entries = [dict(id=row[0], merchant_id=row[1], merchant_name=row[2], first_name=row[3]) for row in cur.fetchall()]
    return repr(entries)

任何帮助将不胜感激。

已编辑>

这是 connect_db 函数:

from torndb import Connection

LOCALHOST = "localhost"
DBNAME = "XXXX"
DBUSER = "XXXX"
DBPASSWORD = "XXXX"


    #connect with DB
    def connect_db():
        db = Connection(LOCALHOST,DBNAME, user=DBUSER, password=DBPASSWORD)
        return  db

    #close the connection from DB
    def close_db(db):
        db.close()
4

2 回答 2

2

如果你想运行一个 SQL 查询,你可以使用 flask-peewee:

db = Database(app)
db.database.execute_sql("some query", [param1, param2])

如果MerchantDetails是模型,您可以尝试:

dist = fn.haversine(
    34.0160, 
    -118.4925, 
    MerchantDetails.lat, 
    MerchantDetails.long, 
    'MILES')
MerchantDetails.select(MerchantDetails, dist.alias('dist')).having(dist < 6000)

要得到:

SELECT A.* , haversine('34.0160',' -118.4925', A.lat, A.long, 'MILES') AS dist 
FROM merchant_details A 
HAVING haversine('34.0160', '-118.4925', A.lat, A.long, 'MILES') <6000
于 2013-12-20T00:03:19.003 回答
1

我的猜测是它connect_db()实际上返回了一个游标而不是一个数据库连接。因此, from 的返回值db.execute实际上是很的(从查询返回的行数)。作为第一步,您应该尝试更改为以下内容:

curr = connect_db()
curr.execute("QUERY")
entries = [... for row in curr.fetchall()]

也很有可能(我没有查看源代码)connect_db正在返回一个新对象,该对象包装了连接对象和光标对象的功能,以便您可以与它进行交互。我自己过去也这样做过。唯一奇怪的是close方法的处理,因为 cursor 和 connection 都定义了close。就我而言,close两者都关闭了。

根据您的评论再次编辑
,没有阅读源代码,connect_db()我只能猜测。但您可能想尝试:

conn = connect_db()
curr = conn.cursor()

并像以前一样进行。如果这仍然给您一个错误,请通过在该列表中添加一个print dir(conn) after the call toconnect_db(). My guess now is that it will show a游标函数来查看它的属性和方法。

于 2013-12-19T14:31:19.400 回答