Database Config
Dokumentasi konfigurasi koneksi database.
Overview
Package config menyediakan function untuk membangun Database Source Name (DSN) dari environment variables.
DatabaseConfiguration Struct
type DatabaseConfiguration struct {
Driver string
Dbname string
Username string
Password string
Host string
Port string
LogMode bool
}
DbConfiguration
Membangun DSN string untuk master dan replica database.
func DbConfiguration() (string, string)
Return Values
| Return | Deskripsi |
|---|---|
| masterDSN | Connection string untuk master database |
| replicaDSN | Connection string untuk replica database |
Implementation
func DbConfiguration() (string, string) {
// Master Database
masterDBName := viper.GetString("MASTER_DB_NAME")
masterDBUser := viper.GetString("MASTER_DB_USER")
masterDBPassword := viper.GetString("MASTER_DB_PASSWORD")
masterDBHost := viper.GetString("MASTER_DB_HOST")
masterDBPort := viper.GetString("MASTER_DB_PORT")
masterDBSslMode := viper.GetString("MASTER_SSL_MODE")
// Replica Database
replicaDBName := viper.GetString("REPLICA_DB_NAME")
replicaDBUser := viper.GetString("REPLICA_DB_USER")
replicaDBPassword := viper.GetString("REPLICA_DB_PASSWORD")
replicaDBHost := viper.GetString("REPLICA_DB_HOST")
replicaDBPort := viper.GetString("REPLICA_DB_PORT")
replicaDBSslMode := viper.GetString("REPLICA_SSL_MODE")
masterDBDSN := fmt.Sprintf(
"host=%s user=%s password=%s dbname=%s port=%s sslmode=%s",
masterDBHost, masterDBUser, masterDBPassword,
masterDBName, masterDBPort, masterDBSslMode,
)
replicaDBDSN := fmt.Sprintf(
"host=%s user=%s password=%s dbname=%s port=%s sslmode=%s",
replicaDBHost, replicaDBUser, replicaDBPassword,
replicaDBName, replicaDBPort, replicaDBSslMode,
)
return masterDBDSN, replicaDBDSN
}
Environment Variables
Master Database
| Variable | Deskripsi | Example |
|---|---|---|
MASTER_DB_HOST | Database host | localhost |
MASTER_DB_PORT | Database port | 5432 |
MASTER_DB_NAME | Database name | sisappra |
MASTER_DB_USER | Database username | postgres |
MASTER_DB_PASSWORD | Database password | secret |
MASTER_SSL_MODE | SSL mode | disable |
Replica Database
| Variable | Deskripsi | Example |
|---|---|---|
REPLICA_DB_HOST | Replica host | replica.db.local |
REPLICA_DB_PORT | Replica port | 5432 |
REPLICA_DB_NAME | Replica database name | sisappra |
REPLICA_DB_USER | Replica username | postgres_read |
REPLICA_DB_PASSWORD | Replica password | secret |
REPLICA_SSL_MODE | SSL mode | disable |
DSN Format
host=HOST user=USER password=PASSWORD dbname=DBNAME port=PORT sslmode=SSLMODE
Example DSN
host=localhost user=postgres password=secret123 dbname=sisappra port=5432 sslmode=disable
SSL Modes
| Mode | Deskripsi |
|---|---|
disable | Tidak menggunakan SSL |
require | Menggunakan SSL, tidak verifikasi certificate |
verify-ca | SSL dengan verifikasi CA |
verify-full | SSL dengan verifikasi CA dan hostname |
Development
MASTER_SSL_MODE=disable
Production
MASTER_SSL_MODE=verify-full
Usage
func main() {
config.SetupConfig()
masterDSN, replicaDSN := config.DbConfiguration()
if err := database.DbConnection(masterDSN, replicaDSN); err != nil {
log.Fatal("Failed to connect to database")
}
}
Connection String for Different Databases
PostgreSQL (Current)
host=localhost user=postgres password=secret dbname=sisappra port=5432 sslmode=disable
MySQL
user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local
SQLite
/path/to/database.db
Best Practices
-
Use Different Credentials for Master/Replica
- Master: Read/Write user
- Replica: Read-only user
-
Enable SSL in Production
MASTER_SSL_MODE=verify-full
REPLICA_SSL_MODE=verify-full -
Use Connection Pooling
sqlDB, _ := db.DB()
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100) -
Monitor Connection Health
sqlDB, _ := db.DB()
if err := sqlDB.Ping(); err != nil {
log.Fatal("Database not reachable")
}
Troubleshooting
Connection Refused
Error: dial tcp 127.0.0.1:5432: connect: connection refused
Solution: Pastikan PostgreSQL server running dan port benar.
Authentication Failed
Error: password authentication failed for user "postgres"
Solution: Cek username dan password di .env.
Database Does Not Exist
Error: database "sisappra" does not exist
Solution: Buat database terlebih dahulu:
CREATE DATABASE sisappra;