在 go 应用程序中集成 google cloud sql 数据库涉及使用流行的 go 框架,例如 gorm 和 x/sql,与 cloud sql 数据库建立连接。这些框架提供便捷的方法来管理数据库连接和执行 crud 操作。通过使用 gorm 或 x/sql 与 cloud sql 建立连接,可以轻松访问和管理云中的关系数据库。
Go框架中集成Google Cloud SQL数据库
简介
在Go应用程序中集成Google Cloud SQL数据库是访问和管理云中关系数据库的必要步骤。本文将向你展示如何使用流行的Go框架,例如GORM和x/sql,与Cloud SQL数据库建立连接。
立即学习“go语言免费学习笔记(深入)”;
先决条件
- 安装Go并配置Go路径
- 创建Cloud SQL实例
- 为Cloud SQL创建服务账号
使用GORM
GORM是一个流行的ORM,它提供了一个与数据库交互的简单、直观的接口。要使用GORM与Cloud SQL连接,请执行以下步骤:
import (
"context"
"fmt"
"io"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
// connectToCloudSQL establishes a connection to the Cloud SQL instance,
// using GORM and the provided database connection parameters.
func connectToCloudSQL(w io.Writer, dbUser, dbPwd, dbName string) (*gorm.DB, error) {
// Note: Saving credentials in environment variables is convenient, but not
// secure - consider a more secure solution such as
// Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
// keep secrets safe.
var (
dbUser = os.Getenv("DB_USER") // e.g. 'my-db-user'
dbPwd = os.Getenv("DB_PASS") // e.g. 'my-db-password'
dbName = os.Getenv("DB_NAME") // e.g. 'my-database'
dbPort = os.Getenv("DB_PORT") // e.g. '3306'
dbTCPHost = os.Getenv("INSTANCE_HOST") // e.g. '127.0.0.1' ('172.17.0.1' if deployed to GAE Flex)
)
dbURI := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true",
dbUser, dbPwd, dbTCPHost, dbPort, dbName)
// dbPool is the pool of database connections.
dbPool, err := gorm.Open("mysql", dbURI)
if err != nil {
return nil, fmt.Errorf("gorm.Open: %v", err)
}
configureDB(dbPool)
_, err = createTable(dbPool, w)
if err != nil {
return nil, fmt.Errorf("createTable: %v", err)
}
return dbPool, nil
}
使用x/sql
x/sql是Go标准库中用于直接与数据库交互的包。使用x/sql与Cloud SQL建立连接,请执行以下步骤:
import (
"context"
"database/sql"
"fmt"
"io"
_ "github.com/go-sql-driver/mysql"
)
// connectWithXSQL establishes a connection to the Cloud SQL instance,
// using the x/sql package and the provided database connection parameters.
func connectWithXSQL(w io.Writer, dbUser, dbPwd, dbName string) (*sql.DB, error) {
var (
dbUser = os.Getenv("DB_USER") // e.g. 'my-db-user'
dbPwd = os.Getenv("DB_PASS") // e.g. 'my-db-password'
dbName = os.Getenv("DB_NAME") // e.g. 'my-database'
dbPort = os.Getenv("DB_PORT") // e.g. '3306'
dbTCPHost = os.Getenv("INSTANCE_HOST") // e.g. '127.0.0.1' ('172.17.0.1' if deployed to GAE Flex)
)
dbURI := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true",
dbUser, dbPwd, dbTCPHost, dbPort, dbName)
// dbPool is the pool of database connections.
dbPool, err := sql.Open("mysql", dbURI)
if err != nil {
return nil, fmt.Errorf("sql.Open: %v", err)
}
configureDB(dbPool, w)
_, err = createTable(dbPool, w)
if err != nil {
return nil, fmt.Errorf("createTable: %v", err)
}
return dbPool, nil
}
实战案例
以下是一个使用GORM与Cloud SQL数据库进行交互的实际示例:
func main() {
ctx := context.Background()
dbPool, err := connectToCloudSQL(os.Stdout, "user", "password", "test")
if err != nil {
log.Fatal(err)
}
defer dbPool.Close()
type User struct {
ID int `gorm:"primary_key"`
Name string
}
// Migrate the schema
dbPool.AutoMigrate(&User{})
// Create
user := User{Name: "John"}
dbPool.Create(&user)
// Read
var retrievedUser User
dbPool.First(&retrievedUser, user.ID)
fmt.Fprintf(os.Stdout, "Retrieved user: %+vn", retrievedUser)
// Update
dbPool.Model(&retrievedUser).Update("Name", "Jane")
// Delete
dbPool.Delete(&retrievedUser)
}