Golang中如何正确传递驱动类型和驱动源参数到函数

Golang中如何正确传递驱动类型和驱动源参数到函数 如何将驱动程序类型和驱动程序源传递给使用ODBC适配器初始化数据库连接的函数?

我需要Driver结构体吗? 有人能帮忙阐明如何以及需要做什么来创建一个实现我上述目的的函数吗?

import (
	"database/sql"
	_"github.com/alexbrainman/odbc"
)

type Driver struct {
	// Stats
	// contains filtered or unexported fields
}

func (d *Driver) InitialiseDBConnection(driverType, driverSourceName string) {
	db, err := sql.Open(driverType, driverSourceNam)

if err != nil {
		panic(err.Error())
	}
	err = db.Ping()
	if err != nil {
		panic(err.Error())
	}
	defer db.Close()
	
}

我需要一个Driver结构体来包含可接受的驱动程序列表吗?还是驱动程序的基础类型是通过函数参数传递的?

谢谢


更多关于Golang中如何正确传递驱动类型和驱动源参数到函数的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

感谢您的澄清。

更多关于Golang中如何正确传递驱动类型和驱动源参数到函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


SQL驱动包拥有一个init()函数,该函数会创建驱动程序并将其注册到SQL包中。您无需自行实例化驱动程序。驱动程序的文档应告知您该驱动程序的注册名称;如果文档未提供,您需要打印sql.Drivers()的输出。

func main() {
    fmt.Println("hello world")
}

在Go中处理数据库连接时,通常不需要创建专门的Driver结构体来管理驱动程序类型。database/sql包已经通过驱动注册机制处理了驱动程序的管理。以下是正确的实现方式:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/alexbrainman/odbc"
)

// 初始化数据库连接并返回*sql.DB
func InitialiseDBConnection(driverType, dataSourceName string) (*sql.DB, error) {
    db, err := sql.Open(driverType, dataSourceName)
    if err != nil {
        return nil, fmt.Errorf("failed to open database: %w", err)
    }
    
    // 验证连接
    if err := db.Ping(); err != nil {
        db.Close()
        return nil, fmt.Errorf("failed to ping database: %w", err)
    }
    
    return db, nil
}

// 使用示例
func main() {
    // ODBC连接示例
    db, err := InitialiseDBConnection("odbc", 
        "Driver={SQL Server};Server=localhost;Database=testdb;Trusted_Connection=yes;")
    if err != nil {
        panic(err)
    }
    defer db.Close()
    
    // 使用数据库连接执行查询
    rows, err := db.Query("SELECT id, name FROM users")
    if err != nil {
        panic(err)
    }
    defer rows.Close()
    
    // 处理查询结果...
}

如果需要管理多个数据库连接或添加额外的配置,可以使用结构体:

type DatabaseManager struct {
    connections map[string]*sql.DB
}

func NewDatabaseManager() *DatabaseManager {
    return &DatabaseManager{
        connections: make(map[string]*sql.DB),
    }
}

func (dm *DatabaseManager) AddConnection(name, driverType, dataSourceName string) error {
    db, err := InitialiseDBConnection(driverType, dataSourceName)
    if err != nil {
        return err
    }
    dm.connections[name] = db
    return nil
}

func (dm *DatabaseManager) GetConnection(name string) (*sql.DB, bool) {
    db, exists := dm.connections[name]
    return db, exists
}

func (dm *DatabaseManager) CloseAll() {
    for _, db := range dm.connections {
        db.Close()
    }
    dm.connections = make(map[string]*sql.DB)
}

关键点:

  1. 驱动程序类型通过sql.Open()的第一个参数传递(如"odbc"、“mysql”、"postgres"等)
  2. 连接字符串作为第二个参数传递
  3. 不需要自定义Driver结构体来管理驱动类型列表
  4. 确保在导入时使用空白导入注册ODBC驱动:_ "github.com/alexbrainman/odbc"
回到顶部