PostgreSQL Array 数组类型与 FreeSql 打出一套【组合拳】

本文介绍了PostgreSQL数据库的数组类型及其在FreeSql ORM中的应用,特别是新增的PgArrayToMany导航属性,支持对数组类型的级联查询、贪婪加载等功能。FreeSql为PostgreSQL的数组类型提供了便捷的操作,简化了多维数组的使用,同时具备丰富的表达式函数、批量操作及多种数据库支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

PostgreSQL 是世界公认的功能最强大的开源数据库,除了基础数据类型 int4/int8/varchar/numeric/timestamp 等,还支持 int4[]/int8[]/varchar[]/numeric[]/timestamp[] 数组类型、hstore 类型(类似 c# Dictionary<string, string>)、gis 类型。

选择一项技术一定是可以帮助我们提升效率,并且使用一定是非常简便的,才能让我们赚取更多时间,早点下班甚至上班摸鱼。这篇文章主要讲数组类型,如何与 FreeSql 打出简便高效的【组合拳】。

PostgreSQL 可以为每一种类型创建数组,比如 int4 对应的数组类型是 int4[]、varchar 对应的数据类型是 varchar[]。

PostgreSQL 虽然支持多维数组,但是不建议使用,因为实际使用中会带来很多操作麻烦,违背了使用简便的初衷。一维数组足够应付很多场景。

FreeSql 本身已经支持五种导航属性,OneToOne/ManyToOne/OneToMany/ManyToMany/Parent,为它们量身打造了级联保存、贪婪加载、延迟加载、级联删除(递归)、CTE递归查询等功能。

今天 FreeSql 为 PostgreSQL Array 数组类型提供了第六种新的导航属性 PgArrayToMany 专属功能。


数组映射

FreeSql 支持 int[] 映射 int4[]

string[] 映射 varchar[]

DateTime[] 映射 timestamp[]

class Model
{
    public Guid Id { get; set; }
    public int[] TypeIds { get; set; }
    public Guid[] UserIds { get; set; }
}

等等,常用的类型都可以直接用数组进行映射,之后就可以像普通类型一样进行 CRUD 操作了。

var model = new Model
{
    Id = Guid.NewGuid(),
    TypeIds = new int[] { 1,2,3 },
    UserIds = new Guid[] { Guid.NewGuid(), Guid.NewGuid() }
};
fsql.Insert(model).ExecuteAffrows(); //插入
fsql.Update<Model>
### PostgreSQL 数组类型的概述 PostgreSQL 提供了一种强大的数据类型——数组,允许在同一列中存储一组相同类型的值。这种特性使得可以高效地处理集合型的数据结构[^1]。 #### 创建带有数组类型的表 要定义一个包含数组类型的列,在创建表时指定 `ARRAY` 类型即可: ```sql CREATE TABLE example_table ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, numbers INTEGER[] -- 定义整数数组 ); ``` 上述语句中,`numbers` 列被声明为一个整数数组。 --- #### 插入数组数据 通过使用大括号 `{}` 来表示数组的内容,并用逗号分隔各个元素。例如: ```sql INSERT INTO example_table (name, numbers) VALUES ('Example', '{1, 2, 3}'); ``` 如果需要插入一个多维数组,则可以用嵌套的大括号表示: ```sql INSERT INTO example_table (name, numbers) VALUES ('Multi-Dimensional', '{{1, 2}, {3, 4}}'); ``` --- #### 查询数组中的特定元素 可以通过下标访问数组中的单个元素。注意,PostgreSQL数组索引是从 **1** 开始的: ```sql SELECT numbers[1] AS first_element FROM example_table; -- 返回第一个元素 ``` 对于多维数组,可以提供多个维度的索引来定位具体位置: ```sql SELECT numbers[2][1] AS specific_element FROM example_table; -- 返回第二行第一列的元素 ``` --- #### 更新数组中的某个元素 更新数组的一个或多个元素可以直接赋新值给对应的索引位置: ```sql UPDATE example_table SET numbers[1] = 99 WHERE id = 1; ``` --- #### 数组函数操作符 PostgreSQL 提供了许多内置函数和操作符来简化数组的操作。 ##### 添加元素到数组 可以使用 `array_append()` 函数将新的元素追加到数组末尾: ```sql UPDATE example_table SET numbers = array_append(numbers, 4) WHERE id = 1; ``` ##### 删除数组中的某项 利用 `array_remove()` 可以移除匹配的第一个元素: ```sql UPDATE example_table SET numbers = array_remove(numbers, 2) WHERE id = 1; ``` ##### 获取数组长度 使用 `array_length()` 查找数组的大小: ```sql SELECT array_length(numbers, 1) AS length_of_numbers FROM example_table; ``` 此处第二个参数指定了维度编号(对于一维数组始终传入 `1`)。 --- #### 高级查询:展开数组 当需要逐条分析数组内的每一项时,可借助 `unnest()` 函数将其分解成单独记录的形式: ```sql SELECT unnest(numbers) AS individual_number FROM example_table; ``` 这有助于进一步聚合统计或者其他表格联结计算。 --- #### 性能优化建议 尽管数组提供了极大的灵活性,但在某些场景下可能会影响性能。为了提升涉及频繁查找的情况下的效率,考虑建立专门针对该字段上的 GIN 索引[^2]: ```sql CREATE INDEX idx_example_table_numbers ON example_table USING gin (numbers); ``` 这样能够加速诸如判断是否存在某一数值之类的条件筛选任务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值