Как получить пользовательский запрос SELECT во Flask?

Я хотел бы получить этот пользовательский запрос на 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()

2 ответа

Решение

С flask-peewee, если вы хотите выполнить SQL-запрос, вы можете сделать:

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

Я думаю, что connect_db() фактически возвращает курсор, а не соединение БД. Таким образом, возвращаемое значение из db.execute на самом деле будет длинным (количество строк, возвращаемых из запроса). В качестве первого шага вы должны попробовать изменить следующее:

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 aфункция курсора в этом списке.

Другие вопросы по тегам