使用Prisma Python客户端连接PostgreSQL遇引擎连接错误求助
问题描述
使用Prisma Python客户端连接本地Docker部署的PostgreSQL时,持续报错prisma.engine.errors.EngineConnectionError: Could not connect to the query engine。此前在1G内存、1CPU的CentOS 8.5服务器上,Nextjs中的Prisma及prisma==0.13.1均可正常运行,迁移到15vCPUs、16GB内存的同系统VM后出现该问题。已确认数据库连接字符串正确,psycopg2可成功连接,但Prisma Python客户端测试失败,日志中DEBUG:prisma._base_client:datasources: None条目存在异常。
环境信息
- 系统:CentOS Linux release 8.5.2111
- Python:3.8.18(源码编译安装)
- Prisma Python客户端版本:0.15.0(0.13.1版本同样失效)
- Prisma CLI版本:5.17.0(已执行
prisma generate)
相关配置与测试代码
Prisma schema文件
// database datasource db { provider = "postgres" url = env("DATABASE_URL") } // generator generator client { provider = "prisma-client-py" recursive_type_depth = 5 interface = "sync" } model User { id String @id @unique email String @unique }
.env文件
DATABASE_URL=postgres://myuser:mypassword@127.0.0.1:5432/mydatabase?sslmode=disable
PostgreSQL Docker Compose配置
version: '3.8' services: db: image: postgres:latest container_name: postgres_db environment: POSTGRES_USER: myuser POSTGRES_PASSWORD: mypassword POSTGRES_DB: mydatabase ports: - "5432:5432" volumes: - db_data:/var/lib/postgresql/data restart: always volumes: db_data:
psycopg2测试代码及结果
import psycopg2 from psycopg2 import OperationalError def test_connection(): try: connection = psycopg2.connect( "postgres://myuser:mypassword@127.0.0.1:5432/mydatabase" ) print("Connection successful!") connection.close() except OperationalError as e: print(f"Connection failed! Error: {e}") if __name__ == "__main__": test_connection()
执行结果:
Connection successful!
Prisma Python客户端测试代码
from prisma import Prisma import logging from dotenv import load_dotenv import os import asyncio load_dotenv() DATABASE_URL = os.getenv("DATABASE_URL") logging.basicConfig(level=logging.DEBUG) async def run(): db = Prisma() print(DATABASE_URL) await db.connect() print("Connected to PostgreSQL database successfully!") await db.disconnect() if __name__ == "__main__": asyncio.run(run())
错误日志摘要
DEBUG:prisma._base_client:datasources: None DEBUG:prisma.engine._query:Running query engine on port 59631 DEBUG:httpcore.connection:connect_tcp.failed exception=ConnectError(ConnectionRefusedError(111, 'Connection refused')) ... prisma.engine.errors.EngineConnectionError: Could not connect to the query engine
解决方案
1. 修复数据源加载问题,手动传入连接参数
日志中datasources: None说明Prisma客户端未正确读取schema中的数据源配置,可在初始化客户端时手动指定:
from prisma import Prisma import os from dotenv import load_dotenv load_dotenv() # 手动指定数据源 db = Prisma(datasources={'db': os.getenv('DATABASE_URL')})
2. 切换为同步客户端模式
schema中generator指定了interface = "sync",应使用同步客户端而非异步模式,修改测试代码:
from prisma import Prisma import logging from dotenv import load_dotenv import os load_dotenv() DATABASE_URL = os.getenv("DATABASE_URL") logging.basicConfig(level=logging.DEBUG) def run(): db = Prisma(datasources={'db': DATABASE_URL}) print(DATABASE_URL) db.connect() print("Connected to PostgreSQL database successfully!") db.disconnect() if __name__ == "__main__": run()
3. 验证查询引擎依赖与权限
- 检查查询引擎二进制文件权限:
chmod +x /root/.cache/prisma-python/binaries/5.17.0/393aa359c9ad4a4bb28630fb5613f9c281cde053/node_modules/prisma/query-engine-rhel-openssl-1.1.x - CentOS 8默认可能缺少OpenSSL 1.1.x,安装对应依赖:
dnf install openssl1.1
4. 重新生成Prisma客户端
确保CLI与客户端版本兼容,删除旧生成文件后重新生成:
rm -rf prisma/client prisma generate
内容的提问来源于stack exchange,提问作者alex fan
相关产品推荐
相关产品推荐

