使用 go:embed 嵌入迁移 SQL 到二进制,移除 runtime.Caller 源码路径依赖, server 和 desktop 发布产物均可在无源码目录环境下完成数据库初始化和迁移。
32 lines
760 B
Go
32 lines
760 B
Go
package migrations
|
||
|
||
import (
|
||
"embed"
|
||
"fmt"
|
||
"io/fs"
|
||
|
||
"github.com/pressly/goose/v3"
|
||
)
|
||
|
||
//go:embed sqlite/*.sql mysql/*.sql
|
||
var FS embed.FS
|
||
|
||
func ForDriver(driver string) (goose.Dialect, fs.FS, error) {
|
||
switch driver {
|
||
case "sqlite":
|
||
subFS, err := fs.Sub(FS, "sqlite")
|
||
if err != nil {
|
||
return goose.DialectSQLite3, nil, fmt.Errorf("SQLite 迁移资源不可用: %w", err)
|
||
}
|
||
return goose.DialectSQLite3, subFS, nil
|
||
case "mysql":
|
||
subFS, err := fs.Sub(FS, "mysql")
|
||
if err != nil {
|
||
return goose.DialectMySQL, nil, fmt.Errorf("MySQL 迁移资源不可用: %w", err)
|
||
}
|
||
return goose.DialectMySQL, subFS, nil
|
||
default:
|
||
return goose.DialectSQLite3, nil, fmt.Errorf("不支持的数据库驱动: %s,仅支持 sqlite 或 mysql", driver)
|
||
}
|
||
}
|