2013-03-19 76 views
7

我正在開發heroku使用它們的Postgres附加Dev開發計劃,它的連接限制爲20。我是python的新手,這可能很簡單,但是我發現很難在不引起OperationalError: (OperationalError) FATAL: too many connections for role的情況下抽象數據庫連接。如何減少使用SQLAlchemy + postgreSQL的連接數量?

目前我有databeam.py

import os 
from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
from settings import databaseSettings 

class Db(object): 
    def __init__(self): 
     self.app = Flask(__name__) 
     self.app.config.from_object(__name__) 
     self.app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL', databaseSettings()) 
     self.db = SQLAlchemy(self.app) 

db = Db() 

,當我的頁面創建一個控制器,我這樣做:

import databeam 

db = databeam.db 
locations = databeam.locations 

templateVars = db.db.session.query(locations).filter(locations.parent == 0).order_by(locations.order.asc()).all() 

這不會產生我想要什麼,但慢慢地,並在次數導致上面提到的錯誤。由於我來自php背景,我對如何處理數據庫連接有一定的心態(即如上面的例子),但我擔心它不適合於python

在一個地方抽象數據庫連接然後在所有導入中使用相同的連接的正確方法是什麼?

回答

10

在SQL Alchemy中,您應該可以創建連接池。這個游泳池是每個Dyno游泳池的大小。在開發和基本計劃,因爲你可以有多達20個,你可以在20,如果你運行1個測功機,10,如果你運行2等要配置池,你可以設置發動機設置此:

engine = create_engine('postgresql://[email protected]/mydb', 
        pool_size=20, max_overflow=0) 

這設置您的數據庫引擎與您自動然後拉的池。您也可以手動配置,對更多的細節可以在SQL鍊金術的彙集指南中找到池 - http://docs.sqlalchemy.org/en/latest/core/pooling.html

+2

我知道這是一個古老的答案,但我無法找到這個細節,我想你能幫助。如果將池大小設置爲20,是不是意味着動態碼只能處理20個併發請求(因爲每個請求都使用數據庫,因此需要從池中進行連接)?這看起來像是一個巨大的瓶頸,所以肯定我誤解了一些東西。幫幫我! – Joe 2016-08-12 04:18:09