typeorm更新之save与update、updateById

save方法与update、updateById这三个方法都有更新数据库的作用,其中save方法在何时会更新何时会保存已经实验过了,现在主要区分一下这几个方法的使用


1.最正常的更新,更新一个已存在实体:

实体:

import { Entity , PrimaryGeneratedColumn , Column ,PrimaryColumn} from 'typeorm'
@Entity()
export class User{
    @PrimaryColumn({
        type:'int'
    })
    id:number
    @Column({
        type:'varchar'
    })
    name:string
}

upadte:

import { createConnection,Repository } from 'typeorm'
import { User } from './User'
createConnection({
    name:'test',
    type: 'mysql',
    host: 'localhost',
    port: 3306,
    username: 'root',
    password: '123456',
    database: "test",
    synchronize:true,
    dropSchema:true,
    charset:'UTF8',
    entities: [
        User
    ]
}).then(async (connection)=>{
    let userRepository = connection.getRepository(User)
    let user = userRepository.create({id:1,name:'张三'})
    let result = await userRepository.save(user)
    console.log(user)
    let result1 = await userRepository.update(user,{name:'李四'})
    console.log(user)
    console.log(result1)
})
输出:

User { id: 1, name: '张三' }
User { id: 1, name: '张三' }
undefined
可以看到,update与insert一样,都是直接对数据库执行操作,不返回数据,也不对被更新实体进行更改

updateById:基本与update一样,也不返回任何东西

save:

then(async (connection)=>{
    let userRepository = connection.getRepository(User)
    let user = userRepository.create({id:1,name:'张三'})
    let result = await userRepository.save(user)
    console.log(user)
    let result1 = await userRepository.save({id:1,name:'李四'})
    console.log(user)
    console.log(result1)
})
输出:

User { id: 1, name: '张三' }
User { id: 1, name: '张三' }
{ id: 1, name: '李四' }

save方法会返回更新后的实体,当然也就是它操作的实体

save方法的更新功能不是明确指定的,而是在其内部进行判断执行的,这是与update方法最主要的区别,在save中会有一个加载执行实体的步骤


2.不正常更新,更新不存在的实体

update:

then(async (connection)=>{
    let userRepository = connection.getRepository(User)
    let user = userRepository.create({id:1,name:'张三'})
    let result = await userRepository.save(user)
    let result1 = await userRepository.update({id:2},{name:'李四'})
    console.log(result1)
})
输出:undefined

这里有些出乎意料,因为更新不存在实体,竟然没有报错,其实数据库本身就是这样的设定:

update user set name="李四" where id=1;
输出:

Query OK, 1 row affected (0.12 sec)
Rows matched: 1  Changed: 1  Warnings: 0
可见,在数据库中执行更新,会返回收到影响的行数

如果更新不存在的行:

update user set name="李四" where id=2;
输出:

Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0
此时,受到影响、匹配的行都为0,但是没有报错,这个特性延续到了update方法

upadteById:与update方法一样

save:当操作不存在于数据库实体时,会直接保存,没必要演示了


3.不正常的更新,更新id

update:

then(async (connection)=>{
    let userRepository = connection.getRepository(User)
    let user = userRepository.create({id:1,name:'张三'})
    let result = await userRepository.save(user)
    let result1 = await userRepository.updateById(1,{id:2,name:'李四'})
    console.log(result1)
})
此时数据库为:

+----+--------+
| id | name   |
+----+--------+
|  2 | 李四   |
说明update方法,可以更改id

updateById:与update方法一样

save:无法做到更改数据id,id改变后只能将实体作为新数据插入,这是一个很大而且基本没啥用的区别









你可能感兴趣的:(typeorm)