connect.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package v8
  2. import (
  3. "context"
  4. "database/sql"
  5. "dbview/service/internal/common/databases/drivers"
  6. "dbview/service/internal/common/databases/meta"
  7. "fmt"
  8. "strings"
  9. _ "github.com/go-sql-driver/mysql"
  10. )
  11. type MySQLDriver struct {
  12. Name string
  13. version string
  14. db *sql.DB
  15. }
  16. func NewMySQLDriver(version string) drivers.Driver {
  17. return &MySQLDriver{Name: "mysql", version: version}
  18. }
  19. func (d *MySQLDriver) Version() string {
  20. return d.version
  21. }
  22. func (d *MySQLDriver) Open(config *meta.ConnectionConfig) (drivers.Connection, error) {
  23. // 组装DSN
  24. dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s",
  25. config.Username,
  26. config.Password,
  27. config.Host,
  28. config.Port,
  29. config.Database,
  30. )
  31. // 处理额外参数
  32. if len(config.ExtraParams) > 0 {
  33. params := ""
  34. for k, v := range config.ExtraParams {
  35. params += fmt.Sprintf("%s=%s&", k, v)
  36. }
  37. // 去掉最后一个&
  38. params = strings.TrimRight(params, "&")
  39. dsn = dsn + "?" + params
  40. }
  41. db, err := sql.Open("mysql", dsn)
  42. if err != nil {
  43. return nil, err
  44. }
  45. // 返回一个连接实例(可以与 MySQLDriver 类型共用结构体),保留 Name/version
  46. return &MySQLDriver{Name: d.Name, version: d.version, db: db}, nil
  47. }
  48. func (q *MySQLDriver) Close() error {
  49. return q.db.Close()
  50. }
  51. // Ping implements drivers.Connection
  52. func (q *MySQLDriver) Ping(ctx context.Context) error {
  53. if q.db == nil {
  54. return fmt.Errorf("db is nil")
  55. }
  56. return q.db.PingContext(ctx)
  57. }