带Psycopg2的烧瓶数据库池

时间:2020-08-21 15:52:19

标签: python postgresql flask psycopg2

从池中获取连接并为每个请求创建一个新的游标是否会影响性能?

class Query:
    pool = None
    connection = None
    cursor = None
    error = {}

    def __init__(self, pool):
        self.pool = pool
        self.connection = self.pool.get()
        self.cursor = self.connection.cursor()

    def run(self, query, parameters=None):
        try:
            self.execute(query, parameters)
        except (
                psycopg2.errors.AdminShutdown,
                psycopg2.NotSupportedError,
                psycopg2.ProgrammingError,
                psycopg2.DataError,
                psycopg2.IntegrityError,
                psycopg2.OperationalError,
                psycopg2.InterfaceError,
                psycopg2.InternalError,
                psycopg2.DatabaseError,
                Exception
        ) as e:
            try:
                # Memorize error
                if 'execute' not in self.error:
                    self.error.setdefault('execute', [])
                self.error['execute'].append(e)
                # Make new connection and cursor and run the query again
                self.__init__(self.pool)
                self.execute(query, parameters)
            except (
                    psycopg2.errors.AdminShutdown,
                    psycopg2.NotSupportedError,
                    psycopg2.ProgrammingError,
                    psycopg2.DataError,
                    psycopg2.IntegrityError,
                    psycopg2.OperationalError,
                    psycopg2.InterfaceError,
                    psycopg2.InternalError,
                    psycopg2.DatabaseError,
                    Exception
            ) as e:
                DatabaseQueryFailed(e)

    def execute(self, query, parameters=None):
        self.cursor.execute(query, parameters)

    def row(self):
        return self.cursor.rowcount

    def fetch(self):
        return self.cursor.fetchall()

    def close(self):
        self.cursor.close()
        self.pool.put(self.connection)

@api.route('/hello', methods=['GET'])
@a.token
def hello_route():
    q = Query(current_app.db)
    q.run('''
        SELECT
            prod_article_pub_id as id
        FROM products.articles
        ''')
    fetch = q.fetch()
    q.close()
    del q
    return {'status': 'ok', 'row': fetch, 'method': a.request.method}

还是在启动应用程序时打开游标并将其用于多个请求更好?

0 个答案:

没有答案