我使用SQLAlchemy(非常好的ORM,但文档不够清晰)与PostgreSQL通讯
一切都很好,直到出现一种情况,即达到最大连接限制的postgres“崩溃”原因:不再允许连接(max_client_conn)。
这种情况使我认为我做错了。经过几次实验后,我弄清楚了如何不再面对该问题,但是还剩下一些问题。
下面,您将看到没有和有提到问题的代码示例(在Python 3+中,PostgreSQL设置为默认设置),以及我想听听的内容最终是下列问题的答案:
上下文管理器到底对连接和会话做了什么?关闭会话并配置连接还是什么?
为什么在“ connect”方法中没有NullPool作为poolclass的情况下,第一个有效的代码示例作为问题的示例?
为什么在第一个示例中,对于所有查询,我只有一个到db的连接,但是在第二个示例中,对于每个查询,我都有单独的连接?(如果我理解不对,请使用“ pgbouncer”进行检查以纠正我)
当您对多个侦听脚本的脚本实例(或脚本中的单独线程)使用SQLAlchemy和PostgreSQL DB时,打开和关闭连接(和/或与Session一起使用)的最佳实践是什么,这是最佳做法,这些实例侦听请求并必须分别与每个会话进行会话?(我的意思是原始SQLAlchemy而不是Flask-SQLAlchemy或类似的东西)
与数据库建立连接:
from sqlalchemy.pool import NullPool # does not work without NullPool, why?
def connect(user, password, db, host='localhost', port=5432):
"""Returns a connection and a metadata object"""
url = 'postgresql://{}:{}@{}:{}/{}'.format(user, password, host, port, db)
temp_con = sqlalchemy.create_engine(url, client_encoding='utf8', poolclass=NullPool)
temp_meta = sqlalchemy.MetaData(bind=temp_con, reflect=True)
return temp_con, temp_meta
使会话与DB一起工作的功能:
from contextlib import contextmanager
@contextmanager
def session_scope():
con_loc, meta_loc = connect(db_user, db_pass, db_instance, 'localhost')
Session = sessionmaker(bind=con_loc)
"""Provide a transactional scope around a series of operations."""
session = Session()
try:
yield session
session.commit()
except:
session.rollback()
raise
查询示例:
with session_scope() as session:
entity = session.query(SomeEntity).first()
月关宝盒
白板的微信
相关分类