在 Postgres 中处理解析 oid
Dealing with parsing oids in Postgres
我目前正在改进 Postgresql 的库客户端,该库已经具有有效的通信协议,包括 DataRow 和 RowDescription。
我现在面临的问题是如何处理价值观。
例如,返回带有整数数组的纯字符串是毫无意义的。
通过我的研究,我发现其他一些库(如 Python)要么 return 是未修改的字符串,要么转换基本类型 包括 数组。
我所说的转换的意思是将 Postgres DataRow 原始数据作为 Python 类型的值:Postgres 整数被解析为 python 数字,Postgres 布尔值被解析为 python 布尔值,等等
我应该进行第二次查询以获取信息列类型并使用其转换器还是应该保持原样?
您可以选择通过将绑定消息中相应的“结果列格式代码”设置为 1 来获取内部格式的数组值,但这通常是一个错误的选择,因为内部格式因类型而异键入甚至可能取决于服务器的体系结构。
所以最好的选择可能是在客户端解析数组的字符串表示形式,包括所有转义字符。
在查找数组类型的基类型时,除了查询 pg_type
like
别无选择
SELECT typelem::regtype FROM pg_type WHERE oid = 1007;
typelem
---------
integer
(1 row)
您可以在客户端缓存这些值,这样您就不必为每个类型和数据库会话查询多次。
我目前正在改进 Postgresql 的库客户端,该库已经具有有效的通信协议,包括 DataRow 和 RowDescription。
我现在面临的问题是如何处理价值观。 例如,返回带有整数数组的纯字符串是毫无意义的。
通过我的研究,我发现其他一些库(如 Python)要么 return 是未修改的字符串,要么转换基本类型 包括 数组。 我所说的转换的意思是将 Postgres DataRow 原始数据作为 Python 类型的值:Postgres 整数被解析为 python 数字,Postgres 布尔值被解析为 python 布尔值,等等
我应该进行第二次查询以获取信息列类型并使用其转换器还是应该保持原样?
您可以选择通过将绑定消息中相应的“结果列格式代码”设置为 1 来获取内部格式的数组值,但这通常是一个错误的选择,因为内部格式因类型而异键入甚至可能取决于服务器的体系结构。
所以最好的选择可能是在客户端解析数组的字符串表示形式,包括所有转义字符。
在查找数组类型的基类型时,除了查询 pg_type
like
SELECT typelem::regtype FROM pg_type WHERE oid = 1007;
typelem
---------
integer
(1 row)
您可以在客户端缓存这些值,这样您就不必为每个类型和数据库会话查询多次。