Как получить пользовательский запрос 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 to
connect_db(). My guess now is that it will show a
функция курсора в этом списке.