如何与sqlalchemy达成postgres最大连接?

时间:2017-01-07 05:06:07

标签: python postgresql sqlalchemy

这与sqlalchemypg8000相关。

我到处都读过我应该关闭ResultProxy对象,以便可以将连接返回到池中。

本地测试数据库允许最多100个连接:

$ psql -h 127.0.0.1 -U postgres
Password for user postgres: 
psql (9.5.5, server 9.6.0)
WARNING: psql major version 9.5, server major version 9.6.
         Some psql features might not work.
Type "help" for help.

postgres=# show max_connections;
 max_connections 
-----------------
 100
(1 row)

以下测试脚本在每个循环中创建一个引擎,不会读取或关闭ResultProxy对象。它真的很糟糕。

奇怪的是,它也不会产生too many connections类错误。这对我来说真的很困惑。 sqlalchemy是否表现出一些魔力?或者postgres可能真的是魔术?

#!/usr/bin/env python2.7
from __future__ import print_function
import sqlalchemy

def handle():
    url = 'postgresql+pg8000://{}:{}@{}:{}/{}'
    url = url.format("postgres", "pass", "127.0.0.1", "5432", "usercity")
    conn = sqlalchemy.create_engine(url, client_encoding='utf8')
    meta = sqlalchemy.MetaData(bind=conn, reflect=True)
    table = meta.tables['events']
    clause = table.select()
    result = conn.execute(clause)


if __name__=='__main__':
    for i in range(2000):
        print(i)
        handle()

1 个答案:

答案 0 :(得分:3)

没有魔法,只是垃圾收集。由于handle()没有返回任何内容(或修改全局数据),因此无法对其创建的连接或游标的引用超出handle()的范围。当它们超出范围时,它们的引用计数降至0,并且它们被删除(没有确定何时发生这种情况,但实际上,在CPython中这会立即发生)。