Typeorm + MySQL(MariaDB) で ON DUPLICATE KEY UPDATE
2020/02/07 16:59:332022/12/07 19:12:28
重複する.ts const data = new User({ id: 1, name: 'a' })
await getConnection()
.createQueryBuilder()
.insert()
.into(User)
.values([data])
.execute()ER_DUP_ENTRY: Duplicate entry '1' for key 'PRIMARY' となります。 onConflict を使うバージョンが大量に出てきますが、これは Postgres のみのオプションのようで、MySQL 系だと普通に無視されてしまいます d.ts に Adds additional ON CONFLICT statement supported in postgres. と書いてあります orUpdate を用いる方法を紹介します。 重複しない.ts const data = new User({ id: 1, name: 'a' })
await getConnection()
.createQueryBuilder()
.insert()
.orUpdate(["name"], "id")
.into(User)
.values([data])
.execute()conflict_target が重複した時(または無指定でも DUP したとき) overwrite に指定された string[] の中身に従って上書きを行います。 orUpdate.sql INSERT INTO `users`(`id`, `name`) VALUES (?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name)ON DUPLICATE KEY UPDATE が実施されていることがわかります。 orUpdate の他のオプションについても記述します。 overwrite: string[] conflictTarget?: string | string[] d.ts みてた時に気づいたんですけど orIgnore というのもありますね。 string | boolean しか受け付けてなさそう。 DO NOTHING っぽい動きをしそうです orIgnore.sql INSERT IGNORE INTO `users`(`id`, `name`) VALUES (?, ?)INSERT IGNORE 構文なんてあるんだ… conflict_targetを前に置いていた場合、順番が逆になっているので注意 Generated from
Typeorm + MySQL(MariaDB) で ON DUPLICATE KEY UPDATE