2015-11-20 430 views
1

我試圖用flask框架創建REST API端點。這是我的全部工作的腳本:Flask RESTful API:與db連接池問題

from flask import Flask, jsonify 
from flask_restful import Resource, Api 
from flask_restful import reqparse 
from sqlalchemy import create_engine 
from flask.ext.httpauth import HTTPBasicAuth 
from flask.ext.cors import CORS 

conn_string = "mssql+pyodbc://x:[email protected]:1433/x?driver=SQL Server" 

auth = HTTPBasicAuth() 

@auth.get_password 
def get_password(username): 
    if username == 'x': 
     return 'x' 
    return None 

app = Flask(__name__) 
cors = CORS(app) 
api = Api(app) 

class Report(Resource): 
    decorators = [auth.login_required] 

    def get(self): 
     parser = reqparse.RequestParser() 
     parser.add_argument('start', type = str) 
     parser.add_argument('end', type = str) 
     args = parser.parse_args() 
     e = create_engine(conn_string) 
     conn = e.connect() 

     stat = """ 
     select x from report 
     """ 

     query = conn.execute(stat) 

     json_dict = [] 


     for i in query.cursor.fetchall(): 
       res = {'x': i[0], 'xx': i[1]} 
       json_dict.append(res) 


     conn.close() 
     e.dispose() 
     return jsonify(results=json_dict) 


api.add_resource(Report, '/report') 

if __name__ == '__main__': 
    app.run(host='0.0.0.0') 

的問題是,我得到的結果,當我把這個API只有一天左右後,除非我重新啓動我的腳本(或有時甚至是我的VM)我停下來得到結果之後我再次得到結果。我認爲數據庫連接池存在一些問題,但我正在關閉連接並進行處理。我不知道爲什麼API只給我一段時間的結果,因爲我必須每隔一天重新啓動我的VM。有任何想法嗎?

+0

也許想想燒瓶SQLAlchemy的擴展?幫助使這件事更容易。 –

回答

0

根據我的經驗,這個問題是由編碼create_engine(conn_string)在類Report中創建數據庫池所致,因此總是對每個安靜的請求執行db pool的destory操作。它不是爲使用SQLAlchemy的ORM正確的方法,並導致與數據庫連接IO種源衝突,請參閱下面的engine.dispose()功能說明在http://docs.sqlalchemy.org/en/rel_1_0/core/connections.html#sqlalchemy.engine.Engine

enter image description here

要解決這個問題,你只需要移動e = create_engine(conn_string)到代碼conn_string = "mssql+pyodbc://x:[email protected]:1433/x?driver=SQL Server"的下方,並刪除類Report中的代碼e.dispose(),如下所示。

conn_string = "mssql+pyodbc://x:[email protected]:1433/x?driver=SQL Server" 
e = create_engine(conn_string) # To here 

def get(delf)功能:

args = parser.parse_args() 
# Move: e = create_engine(conn_string) 
conn = e.connect() 

conn.close() 
# Remove: e.dispose() 
return jsonify(results=json_dict) 
+0

嗨!我仍然收到同樣的錯誤。任何其他想法?我完全按照你上面提到的那樣做了。 – 90abyss

+0

@ 90abyss發生問題時可以得到的任何錯誤?您可以參考故障診斷文檔https://azure.microsoft.com/en-us/documentation/articles/sql-database-connectivity-issues/#diagnostics-log-your-errors查找錯誤。 –