You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache AGE查询返回str而非Node类型,pytest_postgresql环境异常

问题原因

pytest_postgresql的工厂函数创建的数据库连接,默认不会自动注册Apache AGE的agtype类型转换器。而你直接用psycopg2时,应该已经手动调用了age.register(conn)完成类型映射,所以测试环境中返回的是原始字符串而非Node对象。

修复方案

1. 手动注册AGE类型转换器

在测试代码中,获取到postgresql_my连接后,显式调用Apache AGE的注册方法:

import age

# 在测试用例初始化或连接创建后执行该代码
age.register(postgresql_my)

之后再执行Cypher查询,返回的row[0]就会是age.models.Node类型,可直接访问id、labels等属性。

2. 自定义pytest_postgresql连接工厂

如果需要所有测试用例自动处理类型映射,可以自定义连接工厂,在创建连接后自动注册AGE类型:

from pytest_postgresql.factories import postgresql
import age

def my_postgresql_factory(postgresql_proc):
    conn = postgresql(postgresql_proc)
    age.register(conn)
    return conn

postgresql_my = my_postgresql_factory(postgresql_my_proc)
替代方案

放弃pytest_postgresql的工厂函数,手动在测试用例中创建psycopg2连接,完全控制初始化流程:

import psycopg2
import age

def test_age_nodes():
    conn = psycopg2.connect(
        dbname="test_db",
        user="postgres",
        password="postgres",
        host="localhost",
        port=postgresql_my_proc.port
    )
    age.register(conn)
    
    with conn.cursor() as cursor:
        query = """SELECT * FROM cypher('graph', $$ MATCH (v) RETURN v $$) as (v agtype);"""
        cursor.execute(query)
        for row in cursor:
            assert isinstance(row[0], age.models.Node)
            print(row[0].id, row[0].labels)
    conn.close()

内容的提问来源于stack exchange,提问作者abhishek2046

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:38:15