小编dev*_*igy的帖子

SQLAlchemy-处理与数据库和会话的连接(行为不明确,并且在文档中有说明)

我使用SQLAlchemy(非常好的ORM,但文档不够清楚)与PostgreSQL通讯
一切都很好,直到出现一种情况,即达到最大连接限制的postgres“崩溃”原因:不再允许连接(max_client_conn)
这种情况使我认为我做错了。经过几次实验后,我弄清楚了如何不再面对该问题,但是还剩下一些问题。

下面,您将看到没有提到问题的代码示例(在Python 3+中,PostgreSQL设置为默认设置),以及我想听听的内容最终是下列问题的答案:

  1. 上下文管理器到底对连接和会话做了什么?关闭会话并配置连接还是什么?
  2. 为什么在“ connect”方法中没有NullPool作为poolclass的情况下,第一个有效的代码示例作为示例出现问题?
  3. 为什么在第一个示例中,对于所有查询,我只有一个与db的连接,而在第二个示例中,对于每个查询,我都具有单独的连接?(如果我理解不对,请使用“ pgbouncer”进行检查以纠正我)
  4. 当您对多个侦听脚本的脚本实例(或脚本中的单独线程)使用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
Run Code Online (Sandbox Code Playgroud)

获取会话以使用DB的功能

from contextlib import contextmanager

@contextmanager
def session_scope():
    con_loc, meta_loc = connect(db_user, db_pass, db_instance, 'localhost') …
Run Code Online (Sandbox Code Playgroud)

python postgresql sqlalchemy

2
推荐指数
1
解决办法
2270
查看次数

标签 统计

postgresql ×1

python ×1

sqlalchemy ×1