TypeORM在postgres中不支持数组类型?

69

我有一个名为kid_ages的列,它是Integer[]类型。在迁移时,我遇到了以下错误:

DataTypeNotSupportedError:"home.kid_ages"中的数据类型"Array"不受"postgres"数据库支持。

我尝试向我的列添加以下选项:

type: 'array'

而且:

array: true,
default: [],
nullable: false,

@Column({
  array: true,
  default: [],
  nullable: false,
})
kid_ages: string;
7个回答

113

1
哦,看起来我在使用这个时出现了一个错误:“您需要提供明确的类型”。我正在使用以下可空类型:@Field({nullable:true})@Column('text',{array:true})tags?:string [] | null - alexr89
1
我不是TypeORM专家,但你可以尝试将null值默认为一个空数组@Column({ type: "text", array: true, default: [] }) - thopaw

38

如果您想处理实体内的数组或字符串,可以根据@thopaw的答案使用以下代码:

@Column("text", { array: true })
kid_ages: string[];

这应该是被接受的答案。 - benterris
这应该是被接受的答案。 - undefined
你的回复正是我所寻找的。谢谢。 - undefined

24

如上所述,您可以使用以下代码创建Postgres的数组列:

@Column("int", { array: true })
kid_ages: number[];

如果你需要找到一个年龄为5岁的孩子,可以使用以下方法:

kid = getRepository('kid')
        .createQueryBuilder()
        .where(':kid_age = ANY (kid.kid_ages)', { kid_age: 5 });

1
实际上,今天(^0.3.0)只需要使用以下代码即可:repository.find({ where: { kid_ages: ArrayContains([5]), }} - Ivan Talalaev

13

我已经尝试了所有先前提到的解决方案,但它们都不起作用。最终在TypeORM存储库的Github问题中找到了解决方案。

我引用此解决方案:

This was a simple fix, the type of the column shouldn't be an array. Changed to this and it now works:

@Column({array: true})
tags: string;

Better documentation on arrays would have been useful.


8

我对于检查数组包含性的Postgres解决方案如下:

我将该列定义如下:

    @Column("text", { array: true, default: "{}" })
    tags: string[];

this.getFindQueryBuilder().where("recipe.tags && ARRAY[:...tags]", {tags: tags})

"getFindQueryBuilder"是一个获取共享SelectQueryBuilder的函数,以减少代码量。

这里重要的部分是我在示例中展示的where子句。


5
重要的一点是,即使声明整数数组,其默认值也应该定义为空对象。
@Column("int", { array: true, default: {} })
ages: Number[];

2

对于数组,您可以使用simple-array作为类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接