如何在SQLAlchemy和PostgreSQL中减少连接数?
我正在使用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 个回答
15
在SQL Alchemy中,你可以创建一个连接池。这个连接池就是每个Dyno可以使用的连接数量。在开发和基础计划中,由于你最多可以有20个连接,如果你只运行一个dyno,可以把这个数量设置为20;如果你运行两个dyno,可以设置为10,依此类推。要配置你的连接池,你可以设置数据库引擎:
engine = create_engine('postgresql://me@localhost/mydb',
pool_size=20, max_overflow=0)
这段代码会帮你设置数据库引擎,并自动从连接池中获取连接。你也可以手动配置连接池,关于这方面的更多细节可以在SQL Alchemy的连接池指南中找到 - http://docs.sqlalchemy.org/en/latest/core/pooling.html