package v8 import ( "context" "database/sql" "dbview/service/internal/common/databases/drivers" "dbview/service/internal/common/databases/meta" "fmt" "strings" _ "github.com/go-sql-driver/mysql" ) type MySQLDriver struct { Name string version string db *sql.DB } func NewMySQLDriver(version string) drivers.Driver { return &MySQLDriver{Name: "mysql", version: version} } func (d *MySQLDriver) Version() string { return d.version } func (d *MySQLDriver) Open(config *meta.ConnectionConfig) (drivers.Connection, error) { // 组装DSN dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", config.Username, config.Password, config.Host, config.Port, config.Database, ) // 处理额外参数 if len(config.ExtraParams) > 0 { params := "" for k, v := range config.ExtraParams { params += fmt.Sprintf("%s=%s&", k, v) } // 去掉最后一个& params = strings.TrimRight(params, "&") dsn = dsn + "?" + params } db, err := sql.Open("mysql", dsn) if err != nil { return nil, err } // 返回一个连接实例(可以与 MySQLDriver 类型共用结构体),保留 Name/version return &MySQLDriver{Name: d.Name, version: d.version, db: db}, nil } func (q *MySQLDriver) Close() error { return q.db.Close() } // Ping implements drivers.Connection func (q *MySQLDriver) Ping(ctx context.Context) error { if q.db == nil { return fmt.Errorf("db is nil") } return q.db.PingContext(ctx) }