在PostgreSQL自定义一个“优雅”的type

本文介绍了如何在PostgreSQL中优雅地创建自定义数据类型,包括CREATE TYPE、CREATE AGGREGATE、CREATE OPERATOR、CREATE OPERATOR CLASS和CREATE OPERATOR FAMILY的详细步骤。通过示例展示了如何为复杂类型定义输入/输出函数、聚集函数、操作符以及索引支持,使自定义类型具备类似内置类型的全面功能。
摘要由CSDN通过智能技术生成

是的,又是我,不要脸的又来混经验了。我们知道PostgreSQL是一个高度可扩展的数据库,这次我聊聊如何在PostgreSQL里创建一个优雅的type,如何理解优雅?大概就是不仅仅是type本身,其它相关的“服务”都得跟上,要像数据库自带的type一样想怎么用怎么用。

好的,我们开始。

1. CREATE TYPE

PostgreSQL能够被扩展成支持新的数据类型。这一节我们先说说如何定义新的基本类型,这里的type是被定义在SQL语言层面之下的数据类型。创建一种新的基本类型要求使用低层语言(通常是 C)实现在该类型上操作的函数。

例子来自于源代码src/tutorial目录下的complex.sql和complex.c。运行这些例子的指令可以在该目录的README文件中找到。

CREATE TYPE的语法在这里:http://www.postgres.cn/docs/9.5/sql-createtype.html

在PostgreSQL中,一种用户定义的类型必须总是具有输入和输出函数。这些函数决定该类型如何出现在字符串中(用于用户输入或者对用户的输出)以及如何在内存中组织该类型.

关于以上提到的这些,我先不要脸的画一个图吧:

outside(screen)       inside(disk file)    
 |  ------------------------->  |
 | complex_in                   |
 |                              |
 |                              |
 |  <-------------------------  |
 |                  complex_out |

比如我们要创建一个复数类型complex,它的C语言描述如下:

typedef struct Complex {
    double      x;
    double      y;
} Complex;

在用C语言实现时我们将需要让它成为一种传引用类型,因为它没办法放到一个单一的Datum值中(因为Datum里面只能放单一的基本数据类型)。

接着为美观易懂起见,我们选择字符串形式的"(x,y)作为该类型的外部字符串表达"。

也就是说,我们用"(x,y)"表示一个complex,并且在使用时我们这样书写,在查询时,数据库返回的也是这样的字符串。

我们写一个简单的输入函数吧:

Datum
complex_in(PG_FUNCTION_ARGS)
{
    char       *str = PG_GETARG_CSTRING(0);
    double      x,
                y;
    Complex    *result;

    if (sscanf(str, " ( %lf , %lf )", &x, &y) != 2)
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
                 errmsg("invalid input syntax for complex: \"%s\"",
                        str)));

    result = (Complex *) palloc(sizeof(Complex));
    result->x = x;
    result->y = y;
    PG_RETURN_POINTER(result);
}

再来一个输出函数

PG_FUNCTION_INFO_V1(complex_out);

Datum
complex_out(PG_FUNCTION_ARGS)
{
    Complex    *complex = (Complex *) PG_GETARG_POINTER(0);
    char       *result;

    result = psprintf("(%g,%g)", complex->x, complex->y);
    PG_RETURN_CSTRING(result);
}
Spring Boot是一款开源的Java开发框架,可以简化Spring应用程序的开发过程。MyBatis Plus是在MyBatis框架基础上的增强版本,为开发者提供了更便捷的CRUD操作接口和其他实用功能。PostgreSQL是一种开源的关系型数据库管理系统。 在Spring Boot项目中使用MyBatis Plus框架,可以通过添加相应的依赖和配置,快速集成MyBatis Plus。对于PostgreSQL数据库的支持,可以通过引入PostgreSQL的JDBC驱动来实现。 在使用MyBatis Plus与PostgreSQL时,可能会遇到类型转换的问题。例如,某些特定的数据类型在Java和PostgreSQL之间存在差异,需要通过类型处理器(TypeHandler)进行转换。 TypeHandler在MyBatis Plus中是用于处理Java对象与数据库列之间的类型转换的组件。当在实体类中定义了需要特殊处理的属性时,可以通过自定义TypeHandler来实现转换逻辑。在处理与PostgreSQL相关的类型时,可以使用MyBatis Plus提供的内置TypeHandler或自定义TypeHandler。 自定义TypeHandler通常需要实现TypeHandler接口,并指定Java对象与数据库类型的映射关系。在转换过程中,可以使用PostgreSQL JDBC驱动提供的各种方法来处理特定类型的转换逻辑。 在Spring Boot中配置TypeHandler通常需要在MyBatis的配置文件或配置类中进行相关配置。通过指定要使用的TypeHandler和映射关系,可以实现Java对象与PostgreSQL类型的正确转换。 总之,使用Spring Boot、MyBatis Plus和PostgreSQL可以快速构建Java应用程序,并通过TypeHandler来处理类型转换问题,实现Java对象与PostgreSQL数据库之间的无缝集成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值