ent에 Upsert 설치(for PostgreSQL, SQLite 3)

개시하다
  • 업무 관계상 ORM에서 사용ent으로 API를 만들지만, 업셋을 시행할 때 포스트 gres가 걸려 넘어지는 부분이 있기 때문에 Tips가 됐으면 좋겠다고 적었다
  • 발생한 문제
  • Upsert를 구현했지만
  • SQLite에서 일반 동작
  • PostgreSQL에서 다음과 같은 오류가 발생했습니다
  • CreatedAt는 업데이트를 원하지 않지만 업데이트됩니다
  • ERROR: ON CONFLICT DO UPDATE requires inference specification or constraint name (SQLSTATE 42601)
    
    지금 이런 문제가 발생한 사람은 5이다....로 보면 좋을 것 같다
    5. Upsert 설치 시
    카탈로그
  • ent v0.9.0부터 Upsert를 사용할 수 있습니다.
  • generate.go에 sql/upsert 기능 표지 추가
  • Create(insert 데이터)
  • 특정 녀석 업데이트 상황
  • Upsert 설치 시
  • 총결산
  • 참고 자료
  • ent v0.9.0부터 Upsert를 사용할 수 있습니다.
    ↑ 이 글을 참고하여 쓰면 SQLite3의 경우 기대에 부응할 수 있음UpsertUpsert 구현 단계
    generate.go에 sql/upsert 기능 표지 추가 /ent/generate.go package ent - //go:generate go run -mod=mod entgo.io/ent/cmd/ent generate ./schema + //go:generate go run -mod=mod entgo.io/ent/cmd/ent generate --feature sql/upsert ./schema # generate.goo에 sql/upsert를 추가한 후generate schema를 추가하세요 # "On Conflicct"라는 함수 추가 $ go generate ./... Create(insert 데이터) // client: *ent.Client // User: *ent.UserClient ← schema.Goo 내용에 따라 User 부분이 달라질 수 있어요. //↑ 이 두 개는 schema다.goo의 내용에 따라 자동으로 생성 u, err := client.User. Create(). SetUserID("A0001") SetName("user1"). SetAge(20). Save(ctx) 솔리드 작성 특정 녀석 업데이트 상황 u, err := client.User. UpdateOneID(id). SetUserID("A0001") SetName("user1"). SetAge(24). Save(ctx) // or u, err := client.User. Update(). Where(user.UserID("A0001")). SetName("user1") SetAge(24). Save(ctx) ent docs: ID 지정 업데이트 Upsert 설치 시 Postgres에서 이 쓰기 동작(SQLite에서 동작) conflict가 발생할 때 Update 같은 처리 방법을 진행해야 합니다 id, err := client.User. Create(). SetUserID("A0001")//UserID가 Unique로 지정된 경우 SetAge(24). SetName("user1"). OnConflict(). // 만약 무슨 conflict가 발생하면 Update를 진행합니다 UpdateNewValues(). ID(ctx) Postgres로 수정 Postgres의 경우 conflict가 발생할 수 있는 열을 미리 써서 OnConflict의 매개 변수로 지정해야 한다 다만, 이 작법은default에서 만든create입니다.at 및 업데이트업데이트 id, err := client.User. Create(). SetUserID("A0001")//UserID가 Unique로 지정된 경우 SetName("user1"). SetAge(24). - OnConflict(). + OnConflict( + sql.ConflictColumns(user.FieldUserID), + ). UpdateNewValues(). ID(ctx) Insert의 경우 createat를 설정하고 Update를 실행하면create업데이트하지 않음 at id, err := client.User. Create(). SetUserID("A0001") SetName("user1"). SetAge(24). OnConflict( sql.ConflictColumns(user.FieldUserID), ). - UpdateNewValues(). + Update(func(u *ent.UserUpsert) { + u.SetUserID("A0001") + u.SetName("user1") + u.SetAge("24") + u.UpdateUpdatedAt() + }). ID(ctx) Upsert 1개 총결산 ent를 사용하여 Upset을 설치할 때 conflict가 발생하는 열은 OnConflict에서 지정하는 것이 좋습니다 SQLite 및 Postgres 등 여러 환경에서 동일한 코드 사용 가능 OnConflict( sql.ConflictColumns(user.FieldUserID), ). 업데이트를 원하지 않는 열이 있으면 업데이트할 열만 지정합니다. Update(func(u *ent.UserUpsert) { u.SetUserID("A0001") u.SetName("user1") u.SetAge("24") u.UpdateUpdatedAt() }). 참고 자료
  • 버전 0.9.0에 Upsert API 추가!
  • CRUD API - ent.io
  • 좋은 웹페이지 즐겨찾기