Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 类型化条件为空?_Postgresql_Nestjs_Typeorm - Fatal编程技术网

Postgresql 类型化条件为空?

Postgresql 类型化条件为空?,postgresql,nestjs,typeorm,Postgresql,Nestjs,Typeorm,我正在使用TypeORM和Postgres在NestJS中开发一个登录系统。 在我的登录选项中,我建议用户使用一对电子邮件/密码或使用OAuth身份验证。但一旦创建了一个帐户,它们就不是相互排斥的(例如,用户可以在其帐户上附加电子邮件+密码和谷歌帐户) 因此,我希望使密码或OAuthLogin可以为null,但至少其中一个不应该为null 用typeform可以实现这一点吗 @Entity() 类用户{ @PrimaryGeneratedColumn() 公众id:号码; @列({unique:

我正在使用TypeORM和Postgres在NestJS中开发一个登录系统。 在我的登录选项中,我建议用户使用一对电子邮件/密码或使用OAuth身份验证。但一旦创建了一个帐户,它们就不是相互排斥的(例如,用户可以在其帐户上附加电子邮件+密码和谷歌帐户)

因此,我希望使密码或OAuthLogin可以为null,但至少其中一个不应该为null

用typeform可以实现这一点吗

@Entity()
类用户{
@PrimaryGeneratedColumn()
公众id:号码;
@列({unique:true})
公共电子邮件:字符串;
@列({nullable:true})
@排除()
公共密码?:字符串;
@JoinColumn()
@OneToMany(()=>OAuthLogin,(提供者:OAuthLogin)=>provider.user{
答:是的,
})
公共OAuthLogin:OAuthLogin[];
}
导出默认用户;

(附言:对于我当前的代码,我选择将密码设置为只能为空…

简短的回答是否定的,而不是在TypeORM级别。但是,您可以在应用程序代码中使用
类验证器中的装饰器来实现这一点:

@列({nullable:true})
@排除()
@IsNotEmpty()
@ValidateIf(u=>!u.oAuthLogins | | u.oAuthLogins.length==0)
公共密码?:字符串;
@JoinColumn()
@IsArray()
@ValidateIf(u=>!u.password)
@OneToMany(()=>OAuthLogin,(提供者:OAuthLogin)=>provider.user{
答:是的,
})
公共oAuthLogins?:OAuthLogin[];
在应用程序的其他地方:

从“类验证器”导入{validate};
...
验证(用户)
如果此实体正在穿越控制器,您还可以使用NestJS的
ValidationPipe
来升级:

//main.ts
app.useGlobalPipes(新的ValidationPipe({whitelist:true}));

我不知道typeorm,但在postgres中,您需要将两列都设置为空,并在表上添加一个
CHECK
约束或类似的约束。我正在研究这个问题:似乎有一个CHECK decorator我可以使用它进行一些验证,但我找不到如何检查关系是否存在
@Check(
“password”不为NULL或“oAuthLogins”不为NULL
不起作用,因为Postgres查找的是oAuthLogins属性而不是关系。哦,我没有注意到,正如您所说的“nullable”,这是一个关系。不,不能使用检查约束来执行此操作。如果您想在数据库级别执行此操作,则需要一个触发器。实际上,应该为空的不是关系,而是另一端的数据。处理关系数据是ORMs不擅长的一件事,因此,它会变得更复杂^^