前言
在当前软件开发领域中,处理单个应用程序内的多个数据库的需求越来越普遍。具有强大功能的 Golang 是处理此类任务的绝佳解决方案,无论您是与多个数据源合作还是仅为增强组织和可扩展性而分隔数据。在本文中,我们将探讨如何在 Golang 应用程序中管理多个数据库。我们将查看实际情况并提供逐步教程,帮助您掌握这一重要技能。
import ( "database/sql" _ "github.com/lib/pq" _ "github.com/go-sql-driver/mysql" _ "github.com/mattn/go-sqlite3" )第二步:配置数据库连接
type DatabaseConfig struct { Name string Host string Port int User string Password string }第三步:建立数据库连接
func ConnectToPostgreSQL(config DatabaseConfig) (*sql.DB, error) { connStr := fmt.Sprintf("user=%s password=%s dbname=%s host=%s port=%d sslmode=disable", config.User, config.Password, config.Name, config.Host, config.Port) db, err := sql.Open("postgres", connStr) if err != nil { return nil, err } return db, nil } func ConnectToMySQL(config DatabaseConfig) (*sql.DB, error) { connStr := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", config.User, config.Password, config.Host, config.Port, config.Name) db, err := sql.Open("mysql", connStr) if err != nil { return nil, err // 堆代码 duidaima.com } return db, nil } func ConnectToSQLite(config DatabaseConfig) (*sql.DB, error) { db, err := sql.Open("sqlite3", config.Name) if err != nil { return nil, err } return db, nil }第四步:初始化数据库连接
func main() { postgresConfig := DatabaseConfig{ Name: "my_postgres_db", Host: "localhost", Port: 5432, User: "postgres", Password: "password", } mysqlConfig := DatabaseConfig{ Name: "my_mysql_db", Host: "localhost", Port: 3306, User: "root", Password: "password", } sqliteConfig := DatabaseConfig{ Name: "my_sqlite_db.db", } postgresDB, err := ConnectToPostgreSQL(postgresConfig) if err != nil { log.Fatal(err) } mysqlDB, err := ConnectToMySQL(mysqlConfig) if err != nil { log.Fatal(err) } sqliteDB, err := ConnectToSQLite(sqliteConfig) if err != nil { log.Fatal(err) } // Now you have connections to all your databases: postgresDB, mysqlDB, and sqliteDB }与多个数据库交互
// Example query on the PostgreSQL database rows, err := postgresDB.Query("SELECT * FROM users") if err != nil { log.Fatal(err) } defer rows.Close() for rows.Next() { var id int var username string // Scan row data into variables err := rows.Scan(&id, &username) if err != nil { log.Fatal(err) } fmt.Printf("ID: %d, Username: %s\n", id, username) }执行事务
// Begin a transaction on PostgreSQL txPostgres, err := postgresDB.Begin() if err != nil { log.Fatal(err) } defer txPostgres.Rollback() // Rollback on error, or defer Commit() for a successful transaction // Begin a transaction on MySQL txMySQL, err := mysqlDB.Begin() if err != nil { log.Fatal(err) } defer txMySQL.Rollback() // Perform your database operations within each transaction _, err = txPostgres.Exec("UPDATE table1 SET column1 = 'new_value' WHERE id = 1") if err != nil { log.Fatal(err) } _, err = txMySQL.Exec("INSERT INTO table2 (column2) VALUES ('value')") if err != nil { log.Fatal(err) } // Commit the transactions if everything is successful err = txPostgres.Commit() if err != nil { log.Fatal(err) } err = txMySQL.Commit() if err != nil { log.Fatal(err) }结论