我创建了一个简单的表:
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
}
我生成迁移并也运行它。当数据库中没有数据并且运行服务器时,它将成功。但是,当我在数据库中添加1行并再次运行它时,会出现以下错误:
QueryFailedError: the column «price» contain null values
数据库明确地具有包含所有数据的行。我尝试了很多情况,但没有一个是正确的。
有人对此有想法吗?
答案 0 :(得分:4)
我遇到了类似的问题,并且在this thread的底部报告了该问题。
您的ORM配置中可能有synchronize: true
。因此,每次运行应用程序时,Typeorm都会尝试创建表,如果有数据,它会引发误导性错误。
来自here:
synchronize-指示是否应在每次启动应用程序时自动创建数据库模式。请谨慎使用此选项,不要在生产中使用此选项-否则可能会丢失生产数据。此选项在调试和开发期间很有用。作为替代方案,您可以使用CLI并运行schema:sync命令。请注意,对于MongoDB数据库,它不会创建架构,因为MongoDB是无架构的。相反,它仅通过创建索引进行同步。
答案 1 :(得分:0)
如果删除nullable
声明怎么办,或者将其设置为true
...
然后,您可以使用class-validator中的验证修饰符进行nullable
检查。
答案 2 :(得分:0)
我有这个实体
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id!: number;
@Column('text')
firstName!: string;
}
,并且出现错误“列“ firstName”包含空值”。 因此,我在https://github.com/typeorm/typeorm/issues/845的@pleerock建议中添加了{nullable:true},并且有效。
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id!: number;
@Column('text', {nullable: true})
firstName: string;
}
答案 3 :(得分:0)
这行代码是麻烦的制造者:
@Column({ nullable: false, type: "float" })
public price!: number
您已设置nullable: false
,这意味着您永远不希望此列为空。
这为什么给您带来麻烦?
因为您的数据库中已经有没有该列条目的行。
记住:
在此迁移之前,该列不存在。但是现在您正在运行迁移以添加新列。
但是TypeORM需要一种处理现有行的方法...
因此,如果您是TypeORM,那么在该列不存在的情况下,默认情况下会分配什么值?可能是NULL
。这正是它的作用。这就是错误的原因。
这里有两种方式。
在ColumnOptions
@Column({ nullable: false, type: "float", default: 0.0 })
public price!: number
从表中删除所有数据,然后重新运行迁移。
在Postgres PSQL中:
DELETE FROM test;
答案 4 :(得分:0)
设置“同步”:false 将解决此问题:
{
....
"synchronize": false,
....
}
答案 5 :(得分:0)
我遇到了同样的问题。看起来当您添加一个没有默认值的新列时,该列的默认值将是 null
并且如果您没有明确指定它可以是 null
,typeorm 将不允许这样做
对我来说,在添加 @Column({nullable: true})
后它起作用了。这告诉 typeorm 列中可以包含 null
。
或者按照@nathanl93 的建议,您可以提供一个默认值 @Column({default: 'aDefaultValue'})
,如果没有指定其他值,则每次都会使用指定的默认值添加新列。
您需要确保参数 "syncronize": true
已在其中配置了与数据库的连接。对我来说,它是 ormconfig.json
文件。