数据库连接对象不是 Python Django SQL Alchemy 数据库池引发的可调用异常。为啥?

Posted

技术标签:

【中文标题】数据库连接对象不是 Python Django SQL Alchemy 数据库池引发的可调用异常。为啥?【英文标题】:Database connection object is not callable exception thrown with Python Django SQL Alchemy database pooling. Why?数据库连接对象不是 Python Django SQL Alchemy 数据库池引发的可调用异常。为什么? 【发布时间】:2021-06-06 21:39:07 【问题描述】:

我正在努力实现的目标

在 Django 中创建一个数据库连接池。连接池使用SQLAlchemy's connection pooling 和django-postgrespool2 连接到PostgreSQL 数据库。

抛出异常

'psycopg2.extensions.connection' object is not callable 在运行以下代码行poolConnection = dbPool.connect() 时被抛出。打印dbPool 对象和类型显示<sqlalchemy.pool.impl.QueuePool object at 0x00000171832A72B0> <class 'sqlalchemy.pool.impl.QueuePool'>

代码

创建与 PostgreSQL 数据库的连接并创建连接池的数据库助手类:

import psycopg2
from sqlalchemy import pool
import traceback

dbPool = None

class DbPoolHelper:

    def ensurePoolCreated(self):
        global dbPool
        if dbPool != None:
            return
            
        self.createPool()

    def dbConnect(self):
        dbConnection = psycopg2.connect(user="...", password="...", dbname="...", host="...",port="...")
        return dbConnection

    def createPool(self):
        dbConnection = self.dbConnect()
        global dbPool
        dbPool = pool.QueuePool(dbConnection, max_overflow=10, pool_size=5)

    def execute(self, sql, sqlParams):
        try:
            global dbPool
            self.ensurePoolCreated()
            poolConnection = dbPool.connect()
            cursor = poolConnection.cursor()
            cursor.execute(sql, sqlParams)
            poolConnection.commit()
            result = cursor.fetchall()
            cursor.close()
            poolConnection.close()
            return result
        except Exception as e:
            print(e)
            return e

使用DbPoolHelper 的代码通过使用execute 方法获取一些数据并给出一些sql 和sql 参数作为参数:

def poolTest():
    sql = "SELECT * FROM sysproductcontainers;"
    sqlParams = ()
    db = DbPoolHelper()
    result = db.execute(sql, sqlParams)

问题

为什么代码会抛出'psycopg2.extensions.connection' object is not callable

请记住,我对 Python 和 Django 还是很陌生。因此,对于某些 Python 和/或 Django 开发人员来说,我可能遗漏了一些显而易见的东西。

谢谢!

【问题讨论】:

【参考方案1】:

根据QueuePool 文档,第一个参数应该是“返回 DB-API 连接对象的可调用函数”。

您已将调用函数的结果作为第一个参数而不是函数本身传递给QueuePool 对象。去掉括号即可解决问题:

def createPool(self):
    dbConnection = self.dbConnect
    global dbPool
    dbPool = pool.QueuePool(dbConnection, max_overflow=10, pool_size=5)

【讨论】:

以上是关于数据库连接对象不是 Python Django SQL Alchemy 数据库池引发的可调用异常。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中连接 Salesforce 数据库?使用 Python 执行 API 调用?

TypeError:对象在 DJango 1.8 Python 3.4 中不是 JSON 可序列化的

python之路_day107_django中url反向解析及数据库连接

python,django,向mysql更新数据时save()报错不能用

django“类名”对象显示而不是名称

即使数据库将 0 存储为字段值,Django 查询集对象也返回 None 而不是 0