postgresql 如何将一个可空的数据库字段设置为NULL与types?

00jrzges  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(5)|浏览(305)

这似乎是一个简单的问题,但要找到答案似乎是不可能的。
我正在为一个使用Express和Typescript的后端应用程序构建一个密码重置功能。我使用Postgres作为数据库,使用TypeScript作为数据操作。我有一个 User 实体,在我的数据库中有这两个列:

@Column({
    unique: true,
    nullable: true,
})
resetPasswordToken!: string;

@Column({ nullable: true, type: 'timestamp with time zone' })
resetPasswordExpiresAt!: Date;

当用户请求密码重置令牌时,resetPasswordTokenresetPasswordExpiresAt 字段都将填充所需的值。使用发送到用户电子邮件地址的令牌,用户可以重置其密码。重置用户密码后,我想通过将这两个字段设置为 null 来清除它们:

user.resetPasswordToken = null;
user.resetPasswordExpiresAt = null;
user.save()

但是如果我这样做,Typescript会抱怨我分配 null 值的两行:
类型“null”不能分配给类型“string”。

类型“null”不能分配给类型“Date”。
如果我像下面这样将实体中的列更改为接受 null,错误就会消失:

resetPasswordToken!: string | null;
...
resetPasswordExpiresAt!: Date | null;

但是当我启动Express应用程序时,当TypeScript尝试连接到我的数据库时,我得到以下错误:
“postgres”数据库不支持“User.resetPasswordToken”中的数据类型“Object”。
如何将这些字段设置为 null

a64a0gku

a64a0gku1#

经过一夜的休息,我终于解决了我的问题。
TypeScript根据您为typescript中的实体给予变量的类型设置数据库字段的类型。TypeScript将下面的代码转换为我的postgres数据库中的一个 varchar 字段,因为我在typescript中给了它一个 string 类型。

@Column({
    unique: true,
    nullable: true,
})
resetPasswordToken!: string;

这也是我的问题所在。TypeScript获取字段的类型,并尝试根据它读取的类型创建该数据库字段。虽然下面的代码是正确的,但typescript基本上将两种类型封装在一个 object 中,而这个对象正是TypeScript正在读取的对象,从而导致了我得到的错误。

resetPasswordToken!: string | null;

为了解决这个问题,我必须像这样显式地指定数据库字段类型:

@Column({
    type: 'text',
    unique: true,
    nullable: true,
})
resetPasswordToken!: string;
gg58donl

gg58donl2#

公认的答案并不完全正确。在MySQL DB上,字符串类型的默认类型转换是“varchar”。因此,如果使用type: "text",它将错误地定义列。如果你想让它与默认行为兼容,你应该像这样使用类型脚本类型。

@Column({
    type: String,
    unique: true,
    nullable: true,
})
resetPasswordToken!: string | null;
dw1jzc5e

dw1jzc5e3#

@Column('text', {
    unique: true,
    nullable: true,
})
resetPasswordToken!: string;
zqry0prt

zqry0prt4#

为了解决这个问题,我必须像这样显式地指定数据库字段类型:

{
   name: "tag_id",
   type: "varchar",
   isNullable: true
},
fdbelqdn

fdbelqdn5#

要保存具有null值的Date,只需在@Column()标记中启用nullable:true,然后保存对象,而不进行属性赋值

@Column('text', {
    unique: true,
    nullable: true,
})
resetPasswordToken: string;

//user.resetPasswordToken = null

user.save()

相关问题