GORM安裝


GORM安裝

Github GORM

The fantastic ORM library for Golang aims to be developer friendly.

特性

  • 全功能 ORM
  • 關聯 (Has One,Has Many,Belongs To,Many To Many,多態,單表繼承)
  • Create,Save,Update,Delete,Find 中鈎子方法
  • 支持 PreloadJoins 的預加載
  • 事務,嵌套事務,Save Point,Rollback To Saved Point
  • Context、預編譯模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表達式、Context Valuer 進行 CRUD
  • SQL 構建器,Upsert,數據庫鎖,Optimizer/Index/Comment Hint,命名參數,子查詢
  • 復合主鍵,索引,約束
  • Auto Migration
  • 自定義 Logger
  • 靈活的可擴展插件 API:Database Resolver(多數據庫,讀寫分離)、Prometheus…
  • 每個特性都經過了測試的重重考驗
  • 開發者友好

中文官方網站內含十分齊全的中文文檔,有了它你甚至不需要再繼續向下閱讀本文。

一、安裝

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

二、連接數據庫

GORM 官方支持的數據庫類型有: MySQL, PostgreSQL, SQlite, SQL Server

連接不同的數據庫都需要導入對應數據的驅動程序,GORM已經貼心的為我們包裝了一些驅動程序,只需要按如下方式導入需要的數據庫驅動即可:

import _ "gorm.io/driver/mysql"
// import _ "gorm.io/driver/postgres"
// import _ "gorm.io/driver/dialects/sqlite"
// import _ "gorm.io/driver/dialects/mssql"

三、連接MySQL

package main
import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	defer db.Close()
}

注意:想要正確的處理 time.Time ,您需要帶上 parseTime 參數, (更多參數) 要支持完整的 UTF-8 編碼,您需要將 charset=utf8 更改為 charset=utf8mb4 查看 此文章 獲取詳情

MySQl 驅動程序提供了 一些高級配置 可以在初始化過程中使用,例如:

db, err := gorm.Open(mysql.New(mysql.Config{
  DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
  DefaultStringSize: 256, // string 類型字段的默認長度
  DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的數據庫不支持
  DontSupportRenameIndex: true, // 重命名索引時采用刪除並新建的方式,MySQL 5.7 之前的數據庫和 MariaDB 不支持重命名索引
  DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的數據庫和 MariaDB 不支持重命名列
  SkipInitializeWithVersion: false, // 根據當前 MySQL 版本自動配置
}), &gorm.Config{})

自定義驅動

GORM 允許通過 DriverName 選項自定義 MySQL 驅動,例如:

import (
  _ "example.com/my_mysql_driver"
  "gorm.io/gorm"
)

db, err := gorm.Open(mysql.New(mysql.Config{
  DriverName: "my_mysql_driver",
  DSN: "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local", // Data Source Name,參考 https://github.com/go-sql-driver/mysql#dsn-data-source-name
}), &gorm.Config{})

現有的數據庫連接

GORM 允許通過一個現有的數據庫連接來初始化 *gorm.DB

import (
  "database/sql"
  "gorm.io/gorm"
)

sqlDB, err := sql.Open("mysql", "mydb_dsn")
gormDB, err := gorm.Open(mysql.New(mysql.Config{
  Conn: sqlDB,
}), &gorm.Config{})

四、連接PostgreSQL

基本代碼同上,注意引入對應postgres驅動並正確指定gorm.Open()參數。

import (
  "gorm.io/driver/postgres"
  "gorm.io/gorm"
)


func main() {
 	dsn := "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"
	db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
    defer db.Close()
}

五、連接Sqlite3

基本代碼同上,注意引入對應sqlite驅動並正確指定gorm.Open()參數。

import (
  "gorm.io/driver/sqlite"
  "gorm.io/gorm"
)



func main() {
  // github.com/mattn/go-sqlite3
  db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
  defer db.Close()
}

注意: 您也可以使用 file::memory:?cache=shared 替代文件路徑。 這會告訴 SQLite 在系統內存中使用一個臨時數據庫。 (查看 SQLite 文檔 獲取詳情)

六、連接SQL Server

基本代碼同上,注意引入對應mssql驅動並正確指定gorm.Open()參數。

import (
  "gorm.io/driver/sqlserver"
  "gorm.io/gorm"
)


func main() {
	// github.com/denisenkom/go-mssqldb
    dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"
    db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})
    defer db.Close()
}

Clickhouse

https://github.com/go-gorm/clickhouse

import (
  "gorm.io/driver/clickhouse"
  "gorm.io/gorm"
)

func main() {
  dsn := "tcp://localhost:9000?database=gorm&username=gorm&password=gorm&read_timeout=10&write_timeout=20"
  db, err := gorm.Open(clickhouse.Open(dsn), &gorm.Config{})

  // Auto Migrate
  db.AutoMigrate(&User{})
  // Set table options
  db.Set("gorm:table_options", "ENGINE=Distributed(cluster, default, hits)").AutoMigrate(&User{})

  // 插入
  db.Create(&user)

  // 查詢
  db.Find(&user, "id = ?", 10)

  // 批量插入
  var users = []User{user1, user2, user3}
  db.Create(&users)
  // ...
}

七、連接池

GORM 使用 database/sql 維護連接池

sqlDB, err := db.DB()

// SetMaxIdleConns 設置空閑連接池中連接的最大數量
sqlDB.SetMaxIdleConns(10)

// SetMaxOpenConns 設置打開數據庫連接的最大數量。
sqlDB.SetMaxOpenConns(100)

// SetConnMaxLifetime 設置了連接可復用的最大時間。
sqlDB.SetConnMaxLifetime(time.Hour)

查看 通用接口 獲取詳情。

不支持的數據庫

有些數據庫可能兼容 mysqlpostgres 的方言,在這種情況下,你可以直接使用這些數據庫的方言。

對於其它不支持的數據,我們鼓勵且歡迎大家伙開發更多數據庫類型的驅動!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM