12 KiB
📋 PANDUAN MIGRASI MYSQL KE POSTGRESQL - STEP BY STEP
📌 RINGKASAN KONDISI SAAT INI
- Backend Framework: Golang (Gin + GORM)
- Database Saat Ini: MySQL (localhost:3306)
- Database Baru: PostgreSQL (sudah dibuat di pgAdmin4)
- Driver Saat Ini:
github.com/go-sql-driver/mysql+gorm.io/driver/mysql
✅ TAHAP 1: PERSIAPAN & VERIFIKASI
Step 1.1: Verifikasi Database PostgreSQL di pgAdmin4
Lokasi file konfigurasi:
- File:
backendcareit_v4\.env - File koneksi database:
backendcareit_v4\database\db.go
Yang perlu dicek:
- ✓ PostgreSQL sudah berjalan dan bisa diakses dari pgAdmin4
- ✓ Database baru sudah dibuat (catat nama databasenya)
- ✓ User PostgreSQL sudah dibuat (catat username dan passwordnya)
- ✓ Port PostgreSQL (default: 5432)
- ✓ Host PostgreSQL (localhost atau IP address)
Contoh informasi yang diperlukan:
Hostname/Address: localhost
Port: 5432
Username: (nama user PostgreSQL)
Password: (password user PostgreSQL)
Database Name: (nama database PostgreSQL)
✅ TAHAP 2: MIGRASI DATA DARI MYSQL KE POSTGRESQL
Step 2.1: Export Data dari MySQL
Gunakan tools berikut untuk export data:
Option A: Menggunakan MySQL Workbench
- Buka MySQL Workbench
- Koneksi ke MySQL server (localhost:3306)
- Pilih database:
careit_db - Klik menu Server → Data Export
- Pilih tables yang ingin diekspor (semua tables di
careit_db) - Pilih opsi Dump Structure and Data
- Simpan file dengan nama:
careit_backup.sql
Option B: Menggunakan Command Line (PowerShell)
# Jalankan command ini di PowerShell
mysqldump -u root -p careit_db > "C:\Users\rengginang\Desktop\CAREIT_V4\careit_backup.sql"
# Akan diminta password MySQL (tekan Enter jika tidak ada password)
Hasil yang diharapkan:
- File SQL dengan semua struktur tabel dan data:
careit_backup.sql
Step 2.2: Konversi SQL MySQL ke PostgreSQL
Beberapa perbedaan syntax yang perlu dikonversi:
⚠️ Perbedaan Utama MySQL vs PostgreSQL:
| Aspek | MySQL | PostgreSQL |
|---|---|---|
| Type AUTO_INCREMENT | INT AUTO_INCREMENT |
SERIAL atau INT GENERATED ALWAYS AS IDENTITY |
| Type DATETIME | DATETIME |
TIMESTAMP |
| Type TINYINT | TINYINT(1) |
BOOLEAN atau SMALLINT |
| Constraint Engine | Bisa diabaikan | Harus ada (ENGINE=InnoDB menjadi tidak relevan) |
| Charset | CHARACTER SET utf8mb4 |
ENCODING 'UTF8' |
| Function NOW() | NOW() |
CURRENT_TIMESTAMP |
Step 2.2a: Konversi File SQL Manual
- Buka file
careit_backup.sqldengan text editor (VS Code / Notepad++) - Lakukan replace berikut:
Replace Pattern List:
1. Ganti: `AUTO_INCREMENT` → `GENERATED ALWAYS AS IDENTITY`
Contoh:
DARI: `ID_Tarif_RS` int NOT NULL AUTO_INCREMENT,
KE: `ID_Tarif_RS` SERIAL PRIMARY KEY,
2. Ganti: `CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci` → (hapus)
Contoh:
DARI: CREATE TABLE `tarif_rs` (...) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
KE: CREATE TABLE `tarif_rs` (...);
3. Ganti: `ENGINE=InnoDB` → (hapus)
4. Ganti: `DATETIME` → `TIMESTAMP`
Contoh:
DARI: `Tanggal_Dibuat` datetime DEFAULT CURRENT_TIMESTAMP,
KE: `Tanggal_Dibuat` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
5. Ganti: backtick (`) → double quote (")
Contoh:
DARI: CREATE TABLE `users` (
KE: CREATE TABLE "users" (
6. Ganti function names:
- `NOW()` tetap bisa dipakai
- `CURDATE()` tetap bisa dipakai
Step 2.2b: Gunakan Online Tool (Opsional)
Alternatif menggunakan online converter:
- Kunjungi: https://www.pgloader.io/
- Atau gunakan tool: https://www.vertabelo.com/
Step 2.3: Import Data ke PostgreSQL
Option A: Menggunakan pgAdmin4
- Buka pgAdmin4 di browser (default: http://localhost:5050)
- Login dengan credentials pgAdmin4
- Di sebelah kiri, klik database yang sudah dibuat
- Klik menu Tools → Query Tool
- Copy isi file SQL yang sudah dikonversi
- Paste ke Query Tool
- Klik tombol Execute (atau tekan F5)
- Tunggu sampai selesai (jika ada error, perbaiki)
Option B: Menggunakan psql Command Line
# Jalankan di PowerShell
# Pastikan PostgreSQL sudah di PATH
psql -U <username> -d <database_name> -f "C:\Users\rengginang\Desktop\CAREIT_V4\careit_backup.sql"
# Contoh:
psql -U postgres -d careit_db -f "C:\Users\rengginang\Desktop\CAREIT_V4\careit_backup.sql"
Hasil yang diharapkan:
- ✓ Semua tabel sudah ter-import di PostgreSQL
- ✓ Data sudah ter-copy ke PostgreSQL
- ✓ Tidak ada error messages
✅ TAHAP 3: UPDATE BACKEND GOLANG
Step 3.1: Update Go Modules (Dependencies)
File yang perlu diubah: backendcareit_v4\go.mod
Perubahan:
Dari: github.com/go-sql-driver/mysql v1.9.3
Dari: gorm.io/driver/mysql v1.6.0
Ke: github.com/lib/pq v1.10.9 (PostgreSQL driver)
Ke: gorm.io/driver/postgres v1.5.9 (GORM PostgreSQL driver)
Di Command Line / PowerShell:
cd "c:\Users\rengginang\Desktop\CAREIT_V4\backendcareit_v4"
# Hapus dependency MySQL lama
go get -d -u
# Tambah PostgreSQL driver
go get github.com/lib/pq
go get gorm.io/driver/postgres
# Atau jalankan:
go get -u
go mod tidy
Step 3.2: Update File Koneksi Database
File yang perlu diubah: backendcareit_v4\database\db.go
Current Code (MySQL):
import (
"fmt"
"os"
_ "github.com/go-sql-driver/mysql"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func KonekDB() (*gorm.DB, error) {
dsn := os.Getenv("DB_DSN")
if dsn == "" {
user := envOrDefault("DB_USER", "root")
pass := envOrDefault("DB_PASSWORD", "")
host := envOrDefault("DB_HOST", "localhost")
port := envOrDefault("DB_PORT", "3306")
name := envOrDefault("DB_NAME", "care_it_data")
dsn = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, pass, host, port, name)
}
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
return nil, fmt.Errorf("gagal membuka koneksi database: %w", err)
}
return db, nil
}
New Code (PostgreSQL):
import (
"fmt"
"os"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
func KonekDB() (*gorm.DB, error) {
dsn := os.Getenv("DB_DSN")
if dsn == "" {
user := envOrDefault("DB_USER", "postgres")
pass := envOrDefault("DB_PASSWORD", "")
host := envOrDefault("DB_HOST", "localhost")
port := envOrDefault("DB_PORT", "5432")
name := envOrDefault("DB_NAME", "careit_db")
fmt.Println("DB_USER:", os.Getenv("DB_USER"))
fmt.Println("DB_PASSWORD:", os.Getenv("DB_PASSWORD"))
fmt.Println("DB_HOST:", os.Getenv("DB_HOST"))
fmt.Println("DB_PORT:", os.Getenv("DB_PORT"))
fmt.Println("DB_NAME:", os.Getenv("DB_NAME"))
fmt.Println("HOST:", os.Getenv("HOST"))
fmt.Println("PORT:", os.Getenv("PORT"))
dsn = fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", host, port, user, pass, name)
}
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
return nil, fmt.Errorf("gagal membuka koneksi database: %w", err)
}
return db, nil
}
func envOrDefault(key, fallback string) string {
val := os.Getenv(key)
if val == "" {
return fallback
}
return val
}
Penjelasan Perubahan:
- Import berubah dari
gorm.io/driver/mysql→gorm.io/driver/postgres - DSN format berubah dari:
user:pass@tcp(host:port)/dbname?charset=... - DSN format baru:
host=... port=... user=... password=... dbname=... sslmode=disable - Port default berubah dari 3306 → 5432
- Default user berubah dari root → postgres
Step 3.3: Update File Environment Variables
File yang perlu diubah: backendcareit_v4\.env
Current (MySQL):
DB_USER=root
DB_PASSWORD=
DB_HOST=localhost
DB_PORT=3306
DB_NAME=careit_db
New (PostgreSQL):
DB_USER=<username_postgresql>
DB_PASSWORD=<password_postgresql>
DB_HOST=localhost
DB_PORT=5432
DB_NAME=<nama_database_postgresql>
Contoh:
DB_USER=postgres
DB_PASSWORD=password123
DB_HOST=localhost
DB_PORT=5432
DB_NAME=careit_db
✅ TAHAP 4: TESTING & VERIFIKASI
Step 4.1: Test Koneksi Database
cd "c:\Users\rengginang\Desktop\CAREIT_V4\backendcareit_v4"
# Jalankan backend
go run main.go
Expected Output:
DB_USER: postgres
DB_PASSWORD: ****
DB_HOST: localhost
DB_PORT: 5432
DB_NAME: careit_db
HOST: 0.0.0.0
PORT: 8081
Server berjalan di http://0.0.0.0:8081
Akses dari jaringan lain menggunakan IP lokal komputer + port 8081
✓ Jika tidak ada error, koneksi berhasil!
Step 4.2: Test API Endpoints
Gunakan Postman atau curl untuk test:
# Contoh test GET
curl http://localhost:8081/api/endpoint-yang-ada
# Test POST dengan data
curl -X POST http://localhost:8081/api/endpoint-yang-ada `
-H "Content-Type: application/json" `
-d '{"key":"value"}'
Step 4.3: Verifikasi Data di PostgreSQL
Buka pgAdmin4 dan cek:
- Database → careit_db → Schemas → Tables
- Klik kanan table → View/Edit Data
- Verifikasi bahwa data sudah ter-copy dengan benar
⚠️ TAHAP 5: HAL-HAL YANG PERLU DIPERHATIKAN
5.1: Case Sensitivity
- MySQL: Case-insensitive untuk nama table dan column
- PostgreSQL: Case-sensitive untuk nama table dan column
Solusi: Pastikan nama table dan column di models.go sesuai dengan database
5.2: Sequences (AUTO_INCREMENT equivalent)
PostgreSQL menggunakan SEQUENCES untuk AUTO_INCREMENT
Jika ada issue dengan ID generation:
-- Di PostgreSQL Query Tool, jalankan:
SELECT * FROM pg_sequences;
-- Jika sequence tidak ada, buat manual:
CREATE SEQUENCE table_name_id_seq;
5.3: Type Casting
Beberapa operasi math di Go mungkin perlu disesuaikan:
- MySQL: TINYINT(1) → Boolean
- PostgreSQL: BOOLEAN atau SMALLINT
5.4: Time Zone
PostgreSQL dan MySQL menangani timezone berbeda:
- Pastikan environment variable untuk timezone sudah benar
- Di DSN PostgreSQL: bisa tambah
TimeZone=Asia/Jakartajika perlu
📝 CHECKLIST PERSIAPAN MIGRASI
Sebelum melakukan perubahan, pastikan:
- PostgreSQL sudah terinstall dan berjalan
- Database baru sudah dibuat di PostgreSQL (catat nama, user, password, port)
- pgAdmin4 bisa mengakses PostgreSQL
- Data MySQL sudah di-backup (file .sql sudah tersimpan)
- SQL dari MySQL sudah dikonversi ke PostgreSQL format
- Data sudah ter-import ke PostgreSQL
- File
go.modsudah ter-update dengan PostgreSQL driver - File
database/db.gosudah siap untuk diubah - File
.envsudah siap dengan info PostgreSQL baru
📌 FILE-FILE YANG AKAN DIUBAH
backendcareit_v4\go.mod- Tambah/ganti dependenciesbackendcareit_v4\database\db.go- Update koneksi databasebackendcareit_v4\.env- Update kredensial database
File-file yang TIDAK berubah:
- Semua models (file di folder
models/) - Semua handlers (file di folder
handlers/) - Semua services (file di folder
services/) - Frontend code
⏭️ LANGKAH SELANJUTNYA
Setelah Anda:
- ✓ Verifikasi Database PostgreSQL
- ✓ Export data dari MySQL
- ✓ Konversi SQL format
- ✓ Import data ke PostgreSQL
BARU SAAT ITU kita akan:
- Update
go.moddengan PostgreSQL driver - Update
database/db.godengan koneksi PostgreSQL - Update
.envdengan kredensial PostgreSQL - Test seluruh aplikasi
📞 NOTES PENTING
- Jangan ubah code dulu sampai Anda confirm sudah siap
- Backup data MySQL sebelum proses migrasi
- Test di environment lokal dulu sebelum production
- Dokumentasikan setiap step untuk reference ke depan
Created: January 19, 2026 Status: SIAP UNTUK MIGRASI Last Updated: Awaiting User Confirmation