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

Mor*_*lde 7 python postgresql sqlalchemy heroku flask

我正在开发heroku使用他们的Postgres附加组件与Dev计划,其连接限制为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()
Run Code Online (Sandbox Code Playgroud)

当我为页面创建控制器时,我这样做:

import databeam

db = databeam.db
locations = databeam.locations

templateVars = db.db.session.query(locations).filter(locations.parent == 0).order_by(locations.order.asc()).all()
Run Code Online (Sandbox Code Playgroud)

这确实产生了我想要的东西,但是很慢并且有时导致上面提到的错误.由于我来自一个php背景,我对如何处理数据库连接有一定的心态(就像上面的例子),但我担心它不适合python.

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

Cra*_*ens 10

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

engine = create_engine('postgresql://me@localhost/mydb',
                   pool_size=20, max_overflow=0)
Run Code Online (Sandbox Code Playgroud)

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

  • 我知道这是一个陈旧的答案,但我很难找到这个细节,我认为你可以提供帮助.如果将池大小设置为20,这是否意味着dyno只能处理20个并发请求(因为每个请求都使用数据库,因此从池中获取连接)?这似乎是一个巨大的瓶颈,所以我肯定会误解一些东西.救命! (2认同)