是否有可能将 psycopg2 连接保持超过 24 小时。我试过了,但我无法成功执行

Is it possible to persist psycopg2 connection more than 24 hour. I tried but I could not execute successfully

我已经按照下面的代码创建了数据库连接。我的问题基本上是有可能保持连接超过 24 小时。我目前的问题是,如果此代码 运行 进入应用程序超过 24 小时,并且我没有从其他进程对 SQL 进行任何插入或更新。 24 小时后,即使在 tables 中有来自其他进程的新记录。下面的代码 return me before 24 hours value,它在过去 24 小时前执行。

import pandas as pd
import psycopg2

class Database:

    def __init__(self, DATABASE_HOST, DATABASE_USERNAME, DATABASE_PASSWORD,
                 DATABASE_PORT, DATABASE_NAME):
        self.host = DATABASE_HOST
        self.username = DATABASE_USERNAME
        self.password = DATABASE_PASSWORD
        self.port = DATABASE_PORT
        self.dbname = DATABASE_NAME
        self.conn = None

    def connect(self):
        if self.conn is None:
            self.conn = psycopg2.connect(
            host=self.host,
            user=self.username,
            password=self.password,
            port=self.port,
            dbname=self.dbname)

    def rows_to_frame(self, query):
        self.connect()
        return pd.read_sql(query, self.conn)

    def fetchall(self, query):
        self.connect()
        with self.conn.cursor() as cur:
            cur.execute(query)
            records = cur.fetchall()
        cur.close()
        return records

    def fetchone(self, query):
        self.connect()
        with self.conn.cursor() as cur:
            cur.execute(query)
            records = cur.fetchone()
        cur.close()
        return records

文件夹结构如下

Application
    --> pgconnection
        | --> __init__.py
        | --> db.py
    --> Source
        | --> main.py

例如:

__init__.py

from pgconnection import db

print(db.execute('select * from emp')

案例一: 24 小时前记录在 emp table -

---------------------------
id  | name   | salary      |
---------------------------
1   | Sam    | 6000        |
---------------------------
2   | Adam   | 5000        |
----------------------------

以上代码的结果:

打印(db.rows_to_frame('select * from '))

---------------------------
id  | name   | salary      |
---------------------------
1   | Sam    | 6000        |
---------------------------
2   | Adam   | 5000        |
----------------------------

案例 2:

24 小时后,新数据从其他进程添加到 emp table。如果我在创建对象后再次执行查询

---------------------------
id  | name   | salary      |
---------------------------
1   | Sam    | 6000        |
---------------------------
2   | Adam   | 5000        |
---------------------------
3   | Ada    | 5600        |
---------------------------
4   | Stephen | 7899       |
---------------------------

在 运行 main.py 它仍然是 return 结果为

---------------------------
id  | name   | salary      |
---------------------------
1   | Sam    | 6000        |
---------------------------
2   | Adam   | 5000        |
----------------------------

而不是

---------------------------
id  | name   | salary      |
---------------------------
1   | Sam    | 6000        |
---------------------------
2   | Adam   | 5000        |
---------------------------
3   | Ada    | 5600        |
---------------------------
4   | Stephen | 7899       |
---------------------------

可能是什么原因?我无法解决这个问题。请有人指导我哪里出错了,您的意见很有价值。

根据我对数据库连接和持久连接的研究和探索。实际上不建议长时间打开连接,而是应在读写操作完成后立即关闭会话,否则可能会出现连接错误 -

to many client error

并且如果您正在尝试使用 python OOP 进行数据库连接,那么在这种情况下,如果您没有默认关闭连接,如果客户端是长时间的理想选择,那么您的连接将自动关闭,否则它会缓存在 python 中,即使您尝试调用任何方法,它也会 return 您缓存结果。

因此,为了减少数据库连接的迭代次数,您可以做的最好的事情是将数据分成多个分区,并为每个分区创建连接并处理操作,然后成功关闭连接。您也可以对其他分区重复此操作。