| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 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)
- }
|