Gorm merupakan ORM yang dikembangkan untuk bahasa GO, seperti halnya SQLAlchemy pada bahasa python. Golang juga mendukung proses auto migrations, ini adalah alat bantu yang cukup keren yang berfungsi sebagai alat bantu untuk mempercepat kerja developer.

Berikut ini beberapa kelebihan GORM

  • Full-Featured ORM
  •  Associations (has one, has many, belongs to, many to many, polymorphism, single-table inheritance)
  •  Hooks (before/after create/save/update/delete/find)
  •  Eager loading with Preload, Joins
  •  Transactions, Nested Transactions, Save Point, RollbackTo to Saved Point
  •  Context, Prepared Statment Mode, DryRun Mode
  •  Batch Insert, FindInBatches, Find/Create with Map, CRUD with SQL Expr and Context Valuer
  •  SQL Builder, Upsert, Locking, Optimizer/Index/Comment Hints, Named Argument, SubQuery
  •  Composite Primary Key, Indexes, Constraints
  •  Auto Migrations
  •  Logger
  •  Extendable, flexible plugin API: Database Resolver (multiple databases, read/write splitting) / Prometheus…
  •  Every feature comes with tests
  •  Developer Friendly

Go tidak memiliki class yang ada di bahasa-bahasa strict OOP lain. Tapi Go memiliki tipe data struktur yang disebut dengan Struct.

Struct adalah kumpulan definisi variabel (atau property) dan atau fungsi (atau method), yang dibungkus sebagai tipe data baru dengan nama tertentu. Property dalam struct, tipe datanya bisa bervariasi. Mirip seperti map, hanya saja key-nya sudah didefinisikan di awal, dan tipe data tiap itemnya bisa berbeda.

Dari sebuah struct, kita bisa buat variabel baru, yang memiliki atribut sesuai skema struct tersebut. Biasanya variabel tersebut dipanggil dengan istilah object atau object struct.

Pada tutorial kali ini kita akan membahas tentang relasi One-to-Many SQL pada bahasa Go dengan alat bantu Gorm. Sebelum mengikuti step berikutnya buat terlebih dahulu table artikel dan komentar.

CREATE TABLE public.artikel (
	id uuid NOT NULL DEFAULT uuid_generate_v4(),
	title varchar(150) NOT NULL,
	kontent text NOT NULL,
	created_at timestamp NOT NULL,
	updated_at timestamptz NULL,
	deleted_at timestamp NULL,
);
 
 
CREATE TABLE public.komentar (
	id uuid NOT NULL DEFAULT uuid_generate_v4(),
	artikel_id uuid NOT NULL,
	komentar text NOT NULL,
	created_at timestamp NOT NULL,
	updated_at timestamptz NULL,
	deleted_at timestamp NULL
);

dari dua table diatas kita buat terlebih dahulu struct, dan simpan kedalam file models.go

type Artikel struct {
	ID        uuid.UUID  `gorm:"column:id" json:"artikel_id"`
	Title     string     `gorm:"column:title" json:"title"`
	Kontent   string     `gorm:"column:kontent" json:"kontent"`
	CreatedAt time.Time  `gorm:"column:created_at" json:"-"`
	UpdatedAt time.Time  `gorm:"column:updated_at" json:"-"`
	DeletedAt *time.Time `gorm:"column:deleted_at" json:"-"`
}
 
type Komentar struct {
	ID         uuid.UUID  `gorm:"column:id" json:"komentar_id"`
	Artikel_ID string     `gorm:"column:artikel_id" json:"artikel_id"`
	Komentar   string     `gorm:"column:komentar" json:"komentar"`
	CreatedAt  time.Time  `gorm:"column:created_at" json:"-"`
	UpdatedAt  time.Time  `gorm:"column:updated_at" json:"-"`
	DeletedAt  *time.Time `gorm:"column:deleted_at" json:"-"`
}

Dari dua struct diatas kita telah membuat variable-variable untuk mendefinisikan field dari table artikel dan komentar. Selanjutnya untuk melakukan join table artikel dan komentar perhatikan kode dibawah ini :

type Artikel struct {
	ID        uuid.UUID  `gorm:"column:id" json:"artikel_id"`
	Title     string     `gorm:"column:title" json:"title"`
	Kontent   string     `gorm:"column:kontent" json:"kontent"`
	Komentar  []Komentar `gorm:"Foreignkey:Artikel_ID;association_foreignkey:ID;" json:"komentar"`
	CreatedAt time.Time  `gorm:"column:created_at" json:"-"`
	UpdatedAt time.Time  `gorm:"column:updated_at" json:"-"`
	DeletedAt *time.Time `gorm:"column:deleted_at" json:"-"`
}
 
type Komentar struct {
	ID         uuid.UUID  `gorm:"column:id" json:"komentar_id"`
	Artikel_ID string     `gorm:"column:artikel_id" json:"artikel_id"`
	Komentar   string     `gorm:"column:komentar" json:"komentar"`
	CreatedAt  time.Time  `gorm:"column:created_at" json:"-"`
	UpdatedAt  time.Time  `gorm:"column:updated_at" json:"-"`
	DeletedAt  *time.Time `gorm:"column:deleted_at" json:"-"`
}

Perhatikan kode diatas, untuk melakukan relational table tambahkan kode berikut ini :

Komentar  []Komentar `gorm:"Foreignkey:Artikel_ID;association_foreignkey:ID;" json:"komentar"`

Untuk eksekusinyapun cukup sederhana, perhatikan kode berikut ini :

var artikel models.Artikel

Conn.Preload("Komentar").Find(&artikle)

Setelah tereksekusi, kode program diatas akan menghasilkan format data sebagai berikut

{
	"artikel_id":"0909sdf9090-sdfd990-sdfsfs-000",
	"title":"sample tutorial",
	"kontent":"belajar golang",
	"komentar": [
		{
			"komentar_id":"998989-sdfd999090-000-000",
			"artikel_id":"0909sdf9090-sdfd990-sdfsfs-000",
			"komentar":"jadi ingin ikut belajar, hehee"
		}
	]
}
Baca artikel lainya :