如何使用SQLAlchemy + postgreSQL减少连接数?

时间:2013-03-19 10:32:22

标签: python postgresql heroku sqlalchemy flask

我正在 heroku 上使用 Postgres 加载项与开发计划进行开发,该计划的连接限制为20。我是python的新手,这可能是微不足道的,但我发现很难在不导致OperationalError: (OperationalError) FATAL: too many connections for role的情况下抽象数据库连接。

目前我有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不相符。

在一个地方抽象数据库连接然后在所有导入中使用相同的连接的正确方法是什么?

1 个答案:

答案 0 :(得分:10)

在SQL Alchemy中,您应该能够创建连接池。这个池是每个Dyno的池大小。在开发和基本计划中你最多可以有20个,你可以设置为20,如果你运行1个dyno,10个,如果你运行2,等等。要配置你的池,你可以设置引擎:

engine = create_engine('postgresql://me@localhost/mydb',
                   pool_size=20, max_overflow=0)

这会为您的数据库引擎设置一个自动从中提取的池。您也可以手动配置池,有关详细信息,请参阅SQL Alchemy的池指南 - http://docs.sqlalchemy.org/en/latest/core/pooling.html