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
相关产品推荐
相关产品推荐

