【问题标题】:How to fetch a custom SELECT query in Flask?如何在 Flask 中获取自定义 SELECT 查询?
【发布时间】:2014-01-08 03:44:56
【问题描述】:

我想在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()

【问题讨论】:

  • 什么是connect_db?我在 Peewee 和 Flask-Peewee API 中都没有看到该函数,所以这一定是您定义的函数。我们不知道db 是什么,所以我们无法明确告诉您为什么会收到该错误。
  • @MarkHildreth 抱歉,我刚刚编辑了问题,connect_db() 是我连接到 mysql 的第二个连接,但我认为您不需要更多信息来回答我的问题,您知道其他方法吗像上面的查询一样在 flask-peewee 中运行自定义查询?

标签: python mysql flask peewee flask-peewee


【解决方案1】:

如果你想运行一个 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

【讨论】:

    【解决方案2】:

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

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

    connect_db 也很有可能(我没有查看源代码)返回一个新对象,该对象包装了连接对象和光标对象的功能,以便您可以与它进行交互。我自己过去也这样做过。唯一奇怪的是对close 方法的处理,因为游标和连接都定义了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 acursor` 函数来查看其属性和方法。

    【讨论】:

    • 感谢您的注意,我收到“AttributeError: 'Connection' object has no attribute 'fetchall', 是否与同一问题有关?或者查询运行正确,这是另一个问题?
    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 2014-11-13
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    相关资源
    最近更新 更多