2013-12-19 19 views
1

我想對Flask-Peewee如何在Flask中獲取自定義SELECT查詢?

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) 

任何幫助將非常感激。

EDITED>

這裏是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() 
+0

什麼是'connect_db'?我沒有在Peewee和Flask-Peewee API中看到這個函數,所以這個函數必須是你定義的函數。我們不知道'db'是什麼,所以我們不能確切地告訴你爲什麼你會得到這個錯誤。 –

+0

@MarkHildreth對不起,我剛剛編輯了這個問題,connect_db()是我第二次連接到mysql,但我不認爲你需要更多的信息來回答我的問題,你知道任何其他方式來運行自定義查詢在瓶 - peewee喜歡上面的查詢? –

回答

2

隨着燒瓶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 
+0

謝謝!你是最棒的 –

1

我的猜測是,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遊標函數來查看其屬性和方法。

+0

感謝您的留言,我收到了「AttributeError:'Connection'對象沒有'fetchall'屬性,它與相同的問題有關嗎?或者查詢運行正常,這是另一個問題嗎? –

+0

查看我的更新回答 – sberry

相關問題