初始化Newrelic代理后调用Psycopg的register_type()遇类型错误
解决NewRelic代理初始化后Psycopg2 register_type()报TypeError的问题
初始化NewRelic代理后,调用Psycopg2的register_type()函数时会触发以下错误:
TypeError: argument 2 must be a connection, cursor or None
问题原因
运行时的游标被NewRelic的newrelic.hooks.database_psycopg2.CursorWrapper类包装,register_type()无法识别这个包装后的对象,因此抛出类型错误。
解决方案
有两种可行的解决办法:
方法一:获取原始游标对象
CursorWrapper内部持有原始的游标实例,通常可以通过_nr_cursor属性访问(注意不同NewRelic版本可能属性名有变化),将原始游标传入register_type()即可:import psycopg2 from psycopg2.extensions import register_type, UNICODE # 假设cursor是被NewRelic包装后的对象 raw_cursor = cursor._nr_cursor register_type(UNICODE, raw_cursor)方法二:使用数据库连接对象代替游标
register_type()的第二个参数支持传入数据库连接对象,这样会将类型注册应用到该连接下的所有游标,无需处理包装后的游标:import psycopg2 from psycopg2.extensions import register_type, UNICODE conn = psycopg2.connect(database="your_db", user="user", password="pass", host="host") register_type(UNICODE, conn)
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

