2017-07-17 85 views
2

我有一個非常簡單的Python代碼片段來運行Postgres查詢,然後將結果發送到儀表板。我正在使用psycopg2來定期運行相同的查詢。現在我們不必擔心循環機制。postgres緩存我的查詢?

conn = psycopg2.connect(<connection info>) 

    while True: 
     # Run query and update dashboard 
     cur = conn.cursor() 
     cur.execute(q_tcc) 
     query_results = cur.fetchall() 

     update_dashboard(query_results) 
     time.sleep(5) 

僅供參考,實際的查詢是:

q_tcc = """SELECT client_addr, application_name, count(*) cnt FROM pg_stat_activity 
     GROUP BY client_addr, application_name ORDER BY cnt DESC;""" 

當我運行它,我不斷收到即使它們應該被改變了相同的結果。如果我將psycopg2.connect()行移動到conn.close()的循環中,一切正常。根據連接和cursor docs,但是,我應該能夠一直使用相同的光標(並因此連接)。

這是否意味着Postgres在每個客戶端連接的基礎上緩存我的查詢?

+0

你應該在'sleep'之前關閉你的光標。 –

+0

我試過沒有成功,與文檔一致:「現在關閉遊標(而不是每次執行del時),遊標將從此處不可用;如果有任何操作嘗試執行,則會引發InterfaceError光標」 –

回答

3

PostgreSQL沒有查詢緩存。

但是,如果您使用SERIALIZABLE隔離,則可能會看到相同的數據快照,因爲您似乎在單個事務中執行所有查詢。

您應該在循環中的每個查詢後真的提交(或回滾)事務。 conn.rollback()