如何解决如何在 Django Python 中使用 PostgreSQL 设置 SQLAlchemy 连接池的方言?需要启用预 ping 功能
我想要达到的目标
我需要在 Django Python 中激活作为 SQLAlchemy 数据库池的 pre-ping 功能。
错误
当我将 pre_ping
属性设置为 True
时,出现以下错误,提示我在使用 pre-ping 功能时需要将 dialect
传递给连接池:
The ping feature requires that a dialect is passed to the connection pool.
代码
连接池创建者/处理程序的代码:
import psycopg2
from sqlalchemy import create_engine
import traceback
from mbrain import settings
from dataClasses.EmptyObject import *
import json
import sqlalchemy.pool as pool
from sqlalchemy.pool import QueuePool
dbPool = None
class DbPoolHelper:
def ensurePoolCreated(self):
global dbPool
if dbPool != None:
return
self.createPool()
def dbConnect(self):
dbConfig = self.getDbPoolConfig()
dbConnection = psycopg2.connect(user=dbConfig.user,password=dbConfig.password,dbname=dbConfig.dbName,host=dbConfig.host,port=dbConfig.port)
print("=========== POOL CONNECTED =================")
return dbConnection
def createPool(self):
dbConnection = self.dbConnect
global dbPool
dbPool = pool.QueuePool(dbConnection,max_overflow=10,pool_size=5,pre_ping=True)
print("=========== POOL CREATED =================")
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
def getDbPoolConfig(self):
settingName = "pool"
dbConfig = EmptyObject()
dbConfig.host = settings.DATABASES[settingName]["HOST"]
dbConfig.port = settings.DATABASES[settingName]["PORT"]
dbConfig.user = settings.DATABASES[settingName]["USER"]
dbConfig.password = settings.DATABASES[settingName]["PASSWORD"]
dbConfig.dbName = settings.DATABASES[settingName]["NAME"]
dbConfig.poolSize = settings.DATABASES[settingName]["POOL_SIZE"]
dbConfig.poolMaxOverflow = settings.DATABASES[settingName]["POOL_MAX_OVERFLOW"]
dbConfig.poolRecycleTime = settings.DATABASES[settingName]["POOL_RECYCLE_TIME"]
return dbConfig
问题
在使用 PostgreSQL 数据库时如何将这个 dialect
传递给连接池?
其他注意事项
如果您知道另一种创建启用了预 ping 功能的连接池的方法,也欢迎提供这些建议。
谢谢!
解决方法
QueuePool
构造函数将所有关键字参数传递给 Pool
构造函数。此构造函数支持 dialect
参数。因此,您应该能够在 QueuePool
调用中添加方言:
from sqlalchemy.dialects import postgresql
# redacted
dbPool = pool.QueuePool(dbConnection,max_overflow=10,pool_size=5,pre_ping=True,dialect=postgresql.dialect())
# redacted
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。