Postgresql-simple和PostgreSQL特定类型的值

时间:2012-10-06 14:23:14

标签: postgresql haskell

我想使用一些特定于数据库的数据类型,如money,point,inet等。可以将它们作为字符串插入。但是,我找不到如何获取它们的示例,因为它们不在传递给FromField.mkCompats函数的列表中。

当我尝试获取这样的值时,会出现异常

*** Exception: Incompatible {errSQLType = "money", errHaskellType = "Text", errMessage = "types incompatible"}

有没有办法做到这一点而不是诉诸低级postgresql-libpq?

2 个答案:

答案 0 :(得分:2)

是的,postgresql-simple可以做到这一点!但是,之前没有详细记录。查看FromField module中的示例代码。

您可以做的是定义表示Money的类型(例如Text的newtype),然后定义提供适当转换的FromField实例。规范转换首先检查类型,然后检查数据是否为空,最后尝试执行转换。由于money是postgresql本身提供的内置类型,它具有稳定的类型OID,并且为了进行类型检查,您需要做的就是使用typeOID函数。

如果类型由postgresql的扩展提供,则类型OID可能因数据库而异。在这种情况下,我建议使用typename函数来获取不变的字符串。

不幸的是,它还没有(还可以)从其他postgresql类型向现有FromField实例添加转换。

(对不起,迟到的回复,我通常不会访问Stack Overflow。)

答案 1 :(得分:0)

我对haskell一无所知,但是,您应该只能对查询中的值进行类型转换。如:

 select your_money_field::text from your_table;

同样,我不知道你是如何查询的...如果你正在使用某种ORM,那么你可能无法做到这一点。