Ave*_*ian 7 postgresql node.js typescript typeorm
我创建了一个简单的表:
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"
@Entity()
export class Test {
@PrimaryGeneratedColumn()
public id!: number
@Column({ nullable: false })
public name!: string
@Column({ nullable: false, type: "float" })
public price!: number
Run Code Online (Sandbox Code Playgroud)
}
我生成迁移并也运行它。当数据库中没有数据并且运行服务器时,它将成功。但是,当我在数据库中添加1行并再次运行它时,出现以下错误:
QueryFailedError: the column «price» contain null values
Run Code Online (Sandbox Code Playgroud)
该数据库明确具有包含所有数据的行。我尝试了很多情况,但没有一个是正确的。
有人对此有想法吗?
nat*_*l93 16
这里的这行代码是麻烦制造者:
@Column({ nullable: false, type: "float" })
public price!: number
Run Code Online (Sandbox Code Playgroud)
您已设置nullable: false
,这意味着您永远不希望此列为空。
为什么这会给你带来麻烦?
因为您的数据库中已有行没有该列的条目。
记住:
在此迁移之前,该列不存在。但是现在您正在运行迁移以添加新列。
但是 TypeORM 需要一种方法来处理现有的行...
那么,如果您是 TypeORM,那么如果该列不存在,您会默认分配什么值?大概NULL
。这正是它的作用。这就是错误的原因。
这里有两种方法。
设置默认值 ColumnOptions
@Column({ nullable: false, type: "float", default: 0.0 })
public price!: number
Run Code Online (Sandbox Code Playgroud)
从表中删除所有数据,然后重新运行迁移。
在 Postgres PSQL 中:
DELETE FROM test;
Run Code Online (Sandbox Code Playgroud)
我有这个实体
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id!: number;
@Column('text')
firstName!: string;
}
Run Code Online (Sandbox Code Playgroud)
我收到错误“列“firstName”包含空值”。所以我添加了 {nullable: true} 作为 @pleerock 在这里建议的https://github.com/typeorm/typeorm/issues/845 并且它起作用了。
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id!: number;
@Column('text', {nullable: true})
firstName: string;
}
Run Code Online (Sandbox Code Playgroud)
在ormconfig.json中设置"synchronize": false将解决此问题:
{
....
"synchronize": false,
....
}
Run Code Online (Sandbox Code Playgroud)