Add psql & mysql sock connection (#733)

This commit is contained in:
Thomas
2026-06-27 03:16:17 +07:00
committed by GitHub
parent 453bd09173
commit 68038fea7a
4 changed files with 89 additions and 2 deletions
+11
View File
@@ -16,6 +16,17 @@ db-uri: mysql://root:passwd@localhost:3306/opengist_db
OG_DB_URI=mysql://root:passwd@localhost:3306/opengist_db
```
### Unix socket
To connect through a Unix socket instead of TCP, omit the host/port and set the `socket` query parameter to the socket path:
`mysql://<user>:<password>@/<database>?socket=<socket-path>`
```yaml
# Example
db-uri: mysql://root:passwd@/opengist_db?socket=/var/run/mysqld/mysqld.sock
```
### Docker Compose
```yml
services:
@@ -16,6 +16,17 @@ db-uri: postgres://postgres:passwd@localhost:5432/opengist_db
OG_DB_URI=postgres://postgres:passwd@localhost:5432/opengist_db
```
### Unix socket
To connect through a Unix socket instead of TCP, omit the host/port and set the `socket` query parameter to the directory containing the socket:
`postgres://<user>:<password>@/<database>?socket=<socket-directory>`
```yaml
# Example
db-uri: postgres://postgres:passwd@/opengist_db?socket=/var/run/postgresql
```
### Docker Compose
```yml
services:
+21 -2
View File
@@ -41,6 +41,7 @@ type databaseInfo struct {
Password string
Database string
SSLMode string
Socket string
}
var DatabaseInfo *databaseInfo
@@ -94,6 +95,9 @@ func parseDBURI(uri string) (*databaseInfo, error) {
if sslmode := q.Get("sslmode"); sslmode != "" && info.Type == PostgreSQL {
info.SSLMode = sslmode
}
if socket := q.Get("socket"); socket != "" {
info.Socket = socket
}
}
switch info.Type {
@@ -233,7 +237,16 @@ func setupSQLite(dbInfo databaseInfo) error {
func setupPostgres(dbInfo databaseInfo) error {
var err error
dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s", dbInfo.Host, dbInfo.Port, dbInfo.User, dbInfo.Password, dbInfo.Database, dbInfo.SSLMode)
var dsn string
if dbInfo.Socket != "" {
// Unix socket connection: the host parameter points to the socket directory.
dsn = fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=%s", dbInfo.Socket, dbInfo.User, dbInfo.Password, dbInfo.Database, dbInfo.SSLMode)
if dbInfo.Port != "" {
dsn += fmt.Sprintf(" port=%s", dbInfo.Port)
}
} else {
dsn = fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s", dbInfo.Host, dbInfo.Port, dbInfo.User, dbInfo.Password, dbInfo.Database, dbInfo.SSLMode)
}
db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
@@ -245,7 +258,13 @@ func setupPostgres(dbInfo databaseInfo) error {
func setupMySQL(dbInfo databaseInfo) error {
var err error
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", dbInfo.User, dbInfo.Password, dbInfo.Host, dbInfo.Port, dbInfo.Database)
var protocol string
if dbInfo.Socket != "" {
protocol = fmt.Sprintf("unix(%s)", dbInfo.Socket)
} else {
protocol = fmt.Sprintf("tcp(%s:%s)", dbInfo.Host, dbInfo.Port)
}
dsn := fmt.Sprintf("%s:%s@%s/%s?charset=utf8mb4&parseTime=True&loc=Local", dbInfo.User, dbInfo.Password, protocol, dbInfo.Database)
db, err = gorm.Open(mysql.New(mysql.Config{
DSN: dsn,
+46
View File
@@ -0,0 +1,46 @@
package db
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestParseDBURISocket(t *testing.T) {
t.Run("MySQL unix socket", func(t *testing.T) {
info, err := parseDBURI("mysql://root:passwd@/opengist_db?socket=/var/run/mysqld/mysqld.sock")
require.NoError(t, err)
require.Equal(t, MySQL, info.Type)
require.Equal(t, "/var/run/mysqld/mysqld.sock", info.Socket)
require.Equal(t, "root", info.User)
require.Equal(t, "passwd", info.Password)
require.Equal(t, "opengist_db", info.Database)
require.Empty(t, info.Host)
require.Empty(t, info.Port)
})
t.Run("PostgreSQL unix socket", func(t *testing.T) {
info, err := parseDBURI("postgres://postgres:passwd@/opengist_db?socket=/var/run/postgresql")
require.NoError(t, err)
require.Equal(t, PostgreSQL, info.Type)
require.Equal(t, "/var/run/postgresql", info.Socket)
require.Equal(t, "postgres", info.User)
require.Equal(t, "passwd", info.Password)
require.Equal(t, "opengist_db", info.Database)
})
t.Run("PostgreSQL socket keeps sslmode", func(t *testing.T) {
info, err := parseDBURI("postgres://postgres:passwd@/opengist_db?socket=/var/run/postgresql&sslmode=require")
require.NoError(t, err)
require.Equal(t, "/var/run/postgresql", info.Socket)
require.Equal(t, "require", info.SSLMode)
})
t.Run("TCP connection has no socket", func(t *testing.T) {
info, err := parseDBURI("mysql://root:passwd@localhost:3306/opengist_db")
require.NoError(t, err)
require.Empty(t, info.Socket)
require.Equal(t, "localhost", info.Host)
require.Equal(t, "3306", info.Port)
})
}