2017-01-07 36 views
0

これはsqlalchemypg8000に関連しています。postgresへの接続方法sqlalchemyとの最大接続?

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() 

答えて

3

魔法はありません。ちょうどガベージコレクションです。 handle()は何も返さない(またはグローバルデータを変更する)ため、作成する接続またはカーソルへの参照は、handle()の範囲を超えて生きることはできません。スコープ外に出たとき、参照カウントは0になり、それらは削除されます(これはいつ発生するのかについての保証はありませんが、実際にはCPythonではすぐに起こります)。

+0

ありがとうございました。テスト済みで検証済み。 – lingxiao