2757 字
14 分钟
数据库引入
本篇为历史笔记,保留用于兼容已有链接。GORM 主线内容已整理到 Gorm/快速开始,包括学习大纲、快速开始模板、数据源配置、CRUD、事务和 Gin 集成。MongoDB 等非 GORM 内容仍保留在本篇历史内容中。
Gorm 引入 MySQL
初始化
package main
import ( "log" "os" "time"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema")
// 全局数据库对象var DB *gorm.DB
// 示例模型type User struct { ID uint `gorm:"primaryKey"` Username string `gorm:"size:50;unique;not null"` Email string `gorm:"size:100;unique;not null"` Password string `gorm:"size:255;not null"` Age int CreatedAt time.Time UpdatedAt time.Time}
// 初始化数据库func InitDB() {
// MySQL 连接字符串 dsn := "root:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"
// GORM 配置 config := &gorm.Config{
// 跳过默认事务(提高性能) SkipDefaultTransaction: true,
// 开启 SQL 预编译 PrepareStmt: true,
// 命名策略 NamingStrategy: schema.NamingStrategy{
// User -> user SingularTable: true,
// 表名前缀 TablePrefix: "t_", },
// GORM 日志 Logger: logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
// 慢 SQL 阈值 SlowThreshold: time.Second,
// 日志级别 LogLevel: logger.Info,
// 忽略 RecordNotFound IgnoreRecordNotFoundError: true,
// 彩色输出 Colorful: true, }, ), }
var err error
// 建立数据库连接 DB, err = gorm.Open(mysql.Open(dsn), config) if err != nil { log.Fatal("数据库连接失败:", err) }
// 获取底层 sql.DB sqlDB, err := DB.DB() if err != nil { log.Fatal(err) }
// 数据库连接池配置 // 最大空闲连接数 sqlDB.SetMaxIdleConns(10)
// 最大打开连接数 sqlDB.SetMaxOpenConns(100)
// 连接最大生命周期 sqlDB.SetConnMaxLifetime(time.Hour)
// 空闲连接最大生命周期 sqlDB.SetConnMaxIdleTime(30 * time.Minute)
// 测试数据库连接 err = sqlDB.Ping() if err != nil { log.Fatal("数据库 Ping 失败:", err) }
// 自动迁移 err = DB.AutoMigrate(&User{}) if err != nil { log.Fatal("自动迁移失败:", err) }
log.Println("MySQL 初始化成功")}
func main() {
// 初始化数据库 InitDB()
// 初始化 Gin r := gin.Default()
// 测试接口 r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{ "message": "pong", })
})
// 启动服务 r.Run(":8080")}DSN 参数说明
| 参数 | 说明 |
|---|---|
| root | 数据库用户名 |
| 123456 | 数据库密码 |
| 127.0.0.1 | 数据库地址 |
| 3306 | MySQL 默认端口 |
| demo | 数据库名称 |
| charset=utf8mb4 | 使用 UTF-8 字符集,支持 Emoji |
| parseTime=True | 自动将 MySQL 的时间类型解析为 time.Time |
| loc=Local | 使用本地时区 |
Gorm 引入 SQL Server
初始化
package main
import ( "log" "os" "time"
"github.com/gin-gonic/gin"
"gorm.io/driver/sqlserver" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema")
// 全局数据库对象var DB *gorm.DB
// 示例模型type User struct { ID uint `gorm:"primaryKey"` Username string `gorm:"size:50;unique;not null"` Email string `gorm:"size:100;unique;not null"` Password string `gorm:"size:255;not null"` Age int CreatedAt time.Time UpdatedAt time.Time}
// 初始化数据库func InitDB() {
// SQL Server 连接字符串 dsn := "sqlserver://sa:123456@127.0.0.1:1433?database=demo"
// GORM 配置 config := &gorm.Config{
// 跳过默认事务(提高性能) SkipDefaultTransaction: true,
// 开启 SQL 预编译 PrepareStmt: true,
// 命名策略 NamingStrategy: schema.NamingStrategy{
// User -> user SingularTable: true,
// 表名前缀 TablePrefix: "t_", },
// SQL 日志 Logger: logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
// 慢 SQL 阈值 SlowThreshold: time.Second,
// 日志级别 LogLevel: logger.Info,
// 忽略 RecordNotFound IgnoreRecordNotFoundError: true,
// 彩色日志 Colorful: true, }, ), }
var err error
// 建立数据库连接 DB, err = gorm.Open(sqlserver.Open(dsn), config) if err != nil { log.Fatal("数据库连接失败:", err) }
// 获取底层 sql.DB sqlDB, err := DB.DB() if err != nil { log.Fatal(err) }
// 数据库连接池配置 // 最大空闲连接数 sqlDB.SetMaxIdleConns(10)
// 最大打开连接数 sqlDB.SetMaxOpenConns(100)
// 连接最大生命周期 sqlDB.SetConnMaxLifetime(time.Hour)
// 空闲连接最大生命周期 sqlDB.SetConnMaxIdleTime(30 * time.Minute)
// 测试数据库连接 err = sqlDB.Ping() if err != nil { log.Fatal("数据库 Ping 失败:", err) }
// 自动迁移 err = DB.AutoMigrate(&User{}) if err != nil { log.Fatal("自动迁移失败:", err) }
log.Println("SQL Server 初始化成功")}
func main() {
// 初始化数据库 InitDB()
// 初始化 Gin r := gin.Default()
// 测试接口 r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{ "message": "pong", })
})
// 启动服务 r.Run(":8080")}DSN 参数说明
| 参数 | 说明 |
|---|---|
| sa | 数据库用户名 |
| 123456 | 数据库密码 |
| 127.0.0.1 | SQL Server 地址 |
| 1433 | SQL Server 默认端口 |
| database | 数据库名称 |
Gorm 引入 PostgreSQL
初始化
package main
import ( "log" "os" "time"
"github.com/gin-gonic/gin"
"gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema")
// 全局数据库对象var DB *gorm.DB
// 示例模型type User struct { ID uint `gorm:"primaryKey"` Username string `gorm:"size:50;unique;not null"` Email string `gorm:"size:100;unique;not null"` Password string `gorm:"size:255;not null"` Age int CreatedAt time.Time UpdatedAt time.Time}
// 初始化数据库func InitDB() {
// PostgreSQL 连接字符串 dsn := "host=127.0.0.1 user=postgres password=123456 dbname=demo port=5432 sslmode=disable TimeZone=Asia/Shanghai"
// GORM 配置 config := &gorm.Config{
// 跳过默认事务(提高性能) SkipDefaultTransaction: true,
// 开启预编译 SQL PrepareStmt: true,
// 命名策略 NamingStrategy: schema.NamingStrategy{
// User -> user SingularTable: true,
// 表名前缀 TablePrefix: "t_", },
// GORM 日志 Logger: logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
// 慢 SQL 阈值 SlowThreshold: time.Second,
// 日志级别 LogLevel: logger.Info,
// 忽略 RecordNotFound IgnoreRecordNotFoundError: true,
// 彩色输出 Colorful: true, }, ), }
var err error
// 建立数据库连接 DB, err = gorm.Open(postgres.Open(dsn), config) if err != nil { log.Fatal("数据库连接失败:", err) }
// 获取底层 sql.DB sqlDB, err := DB.DB() if err != nil { log.Fatal(err) }
// 数据库连接池配置 // 最大空闲连接数 sqlDB.SetMaxIdleConns(10)
// 最大打开连接数 sqlDB.SetMaxOpenConns(100)
// 连接最大生命周期 sqlDB.SetConnMaxLifetime(time.Hour)
// 空闲连接最大生命周期 sqlDB.SetConnMaxIdleTime(30 * time.Minute)
// 测试数据库连接 err = sqlDB.Ping() if err != nil { log.Fatal("数据库 Ping 失败:", err) }
// 自动迁移 err = DB.AutoMigrate(&User{}) if err != nil { log.Fatal("自动迁移失败:", err) }
log.Println("PostgreSQL 初始化成功")}
func main() {
// 初始化数据库 InitDB()
// 初始化 Gin r := gin.Default()
// 测试接口 r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{ "message": "pong", })
})
// 启动服务 r.Run(":8080")}DSN 参数说明
| 参数 | 说明 |
|---|---|
| host | 数据库地址 |
| user | 用户名 |
| password | 密码 |
| dbname | 数据库名称 |
| port | PostgreSQL 默认端口(5432) |
| sslmode | 是否启用 SSL(开发环境一般使用 disable) |
| TimeZone | 数据库时区 |
Gorm 引入 SQLite
初始化
package main
import ( "log" "os" "time"
"github.com/gin-gonic/gin"
"gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema")
// 全局数据库对象var DB *gorm.DB
// 示例模型type User struct { ID uint `gorm:"primaryKey"` Username string `gorm:"size:50;unique;not null"` Email string `gorm:"size:100;unique;not null"` Password string `gorm:"size:255;not null"` Age int CreatedAt time.Time UpdatedAt time.Time}
// 初始化数据库func InitDB() {
// SQLite 数据库文件 dsn := "demo.db"
// GORM 配置 config := &gorm.Config{
// 跳过默认事务(提高性能) SkipDefaultTransaction: true,
// 开启 SQL 预编译 PrepareStmt: true,
// 命名策略 NamingStrategy: schema.NamingStrategy{
// User -> user SingularTable: true,
// 表名前缀 TablePrefix: "t_", },
// SQL 日志 Logger: logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
// 慢 SQL 阈值 SlowThreshold: time.Second,
// 日志级别 LogLevel: logger.Info,
// 忽略 RecordNotFound IgnoreRecordNotFoundError: true,
// 彩色输出 Colorful: true, }, ), }
var err error
// 建立数据库连接 DB, err = gorm.Open(sqlite.Open(dsn), config) if err != nil { log.Fatal("数据库连接失败:", err) }
// 获取底层 sql.DB sqlDB, err := DB.DB() if err != nil { log.Fatal(err) }
// SQLite 连接配置 // SQLite 一般建议保持较少连接 sqlDB.SetMaxIdleConns(1)
sqlDB.SetMaxOpenConns(1)
sqlDB.SetConnMaxLifetime(time.Hour)
sqlDB.SetConnMaxIdleTime(30 * time.Minute)
// 测试数据库连接 err = sqlDB.Ping() if err != nil { log.Fatal("数据库 Ping 失败:", err) }
// 自动迁移 err = DB.AutoMigrate(&User{}) if err != nil { log.Fatal("自动迁移失败:", err) }
log.Println("SQLite 初始化成功")}
func main() {
// 初始化数据库 InitDB()
// 初始化 Gin r := gin.Default()
// 测试接口 r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{ "message": "pong", })
})
// 启动服务 r.Run(":8080")}DSN 参数说明
DSN 就是数据库文件路径
dsn := "demo.db"第三方驱动 gorm-oracle 引入 Oracle
初始化
package main
import ( "log" "os" "time"
"github.com/gin-gonic/gin"
oracle "github.com/godoes/gorm-oracle"
"gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema")
// 全局数据库对象var DB *gorm.DB
// 示例模型type User struct { ID uint `gorm:"primaryKey"` Username string `gorm:"size:50;unique;not null"` Email string `gorm:"size:100;unique;not null"` Password string `gorm:"size:255;not null"` Age int CreatedAt time.Time UpdatedAt time.Time}
// 初始化数据库func InitDB() {
// Oracle 连接字符串 dsn := "oracle://system:123456@127.0.0.1:1521/XEPDB1"
// GORM 配置 config := &gorm.Config{
// 跳过默认事务 SkipDefaultTransaction: true,
// 开启 SQL 预编译 PrepareStmt: true,
// 命名策略 NamingStrategy: schema.NamingStrategy{
// User -> user SingularTable: true,
// 表名前缀 TablePrefix: "t_", },
// SQL 日志 Logger: logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
SlowThreshold: time.Second,
LogLevel: logger.Info,
IgnoreRecordNotFoundError: true,
Colorful: true, }, ), }
var err error
// 建立数据库连接 DB, err = gorm.Open(oracle.Open(dsn), config) if err != nil { log.Fatal("数据库连接失败:", err) }
// 获取底层 sql.DB sqlDB, err := DB.DB() if err != nil { log.Fatal(err) }
// 数据库连接池配置 // 最大空闲连接数 sqlDB.SetMaxIdleConns(10)
// 最大打开连接数 sqlDB.SetMaxOpenConns(100)
// 连接最大生命周期 sqlDB.SetConnMaxLifetime(time.Hour)
// 空闲连接最大生命周期 sqlDB.SetConnMaxIdleTime(30 * time.Minute)
// 检测数据库连接 err = sqlDB.Ping() if err != nil { log.Fatal("数据库 Ping 失败:", err) }
// 自动迁移 err = DB.AutoMigrate(&User{}) if err != nil { log.Fatal("自动迁移失败:", err) }
log.Println("Oracle 初始化成功")}
func main() {
// 初始化数据库 InitDB()
// 初始化 Gin r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{ "message": "pong", })
})
r.Run(":8080")}DSN 参数说明
| 参数 | 说明 |
|---|---|
| system | 数据库用户名 |
| 123456 | 数据库密码 |
| 127.0.0.1 | Oracle 服务器地址 |
| 1521 | Oracle 默认端口 |
| XEPDB1 | Oracle 服务名(Service Name) |
官方驱动 godror 引入 Oracle
初始化
package main
import ( "database/sql" "log" "time"
"github.com/gin-gonic/gin"
_ "github.com/godror/godror")
// 全局数据库对象var DB *sql.DB
// 初始化数据库func InitDB() {
// Oracle DSN dsn := `user="system" password="123456" connectString="127.0.0.1:1521/XEPDB1"`
var err error
// 建立数据库连接 DB, err = sql.Open("godror", dsn) if err != nil { log.Fatal("数据库连接失败:", err) }
// 数据库连接池配置 // 最大空闲连接数 DB.SetMaxIdleConns(10)
// 最大打开连接数 DB.SetMaxOpenConns(100)
// 连接最大生命周期 DB.SetConnMaxLifetime(time.Hour)
// 空闲连接最大生命周期 DB.SetConnMaxIdleTime(30 * time.Minute)
// 测试数据库连接 err = DB.Ping() if err != nil { log.Fatal("数据库 Ping 失败:", err) }
log.Println("Oracle 初始化成功")}
func main() {
// 初始化数据库 InitDB()
// 初始化 Gin r := gin.Default()
// 测试接口 r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{ "message": "pong", })
})
// 启动服务 r.Run(":8080")}DSN 参数说明
| 参数 | 说明 |
|---|---|
| user | Oracle 用户名 |
| password | Oracle 密码 |
| connectString | 数据库地址 + 端口 + Service Name |
官方驱动 clickhouse-go/v2 引入 ClickHouse
初始化
package main
import ( "database/sql" "log" "time"
"github.com/ClickHouse/clickhouse-go/v2" "github.com/gin-gonic/gin")
var DB *sql.DB
// 初始化数据库func InitDB() {
var err error
// 建立数据库连接 DB = clickhouse.OpenDB(&clickhouse.Options{
// 支持多个节点,官方驱动会自动进行负载均衡和故障切换 Addr: []string{ "192.168.1.10:9000", "192.168.1.11:9000", "192.168.1.12:9000", }
Auth: clickhouse.Auth{ Database: "default", Username: "default", Password: "", },
Settings: clickhouse.Settings{ "max_execution_time": 60, },
DialTimeout: 5 * time.Second,
Compression: &clickhouse.Compression{ Method: clickhouse.CompressionLZ4, }, })
// 数据库连接池配置 DB.SetMaxIdleConns(10)
DB.SetMaxOpenConns(100)
DB.SetConnMaxLifetime(time.Hour)
DB.SetConnMaxIdleTime(30 * time.Minute)
// 测试数据库连接 err = DB.Ping() if err != nil { log.Fatal("数据库 Ping 失败:", err) }
log.Println("ClickHouse 初始化成功")}
func main() {
InitDB()
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{ "message": "pong", })
})
r.Run(":8080")}配置说明
| 配置 | 说明 |
|---|---|
| Addr | ClickHouse 服务地址 |
| Database | 数据库名称 |
| Username | 用户名 |
| Password | 密码 |
| Auth | 用户认证 |
| DialTimeout | 建立连接超时时间 |
| Compression | 数据压缩 |
| Settings | Session 参数 |
| TLS | TLS 配置 |
| Protocol | TCP / HTTP 协议 |
| Debug | 是否开启调试日志 |
官方驱动 mongo-driver 引入 MongoDB
初始化
package main
import ( "context" "log" "time"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/v2/mongo" "go.mongodb.org/mongo-driver/v2/mongo/options")
var ( Client *mongo.Client DB *mongo.Database)
// 初始化 MongoDBfunc InitMongo() {
// 创建 Context ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel()
// MongoDB URI uri := "mongodb://root:123456@127.0.0.1:27017"
// 创建 Client 配置 opts := options.Client(). ApplyURI(uri). SetMaxPoolSize(100). SetMinPoolSize(10). SetMaxConnIdleTime(30 * time.Minute)
var err error
// 建立连接 Client, err = mongo.Connect(opts) if err != nil { log.Fatal("MongoDB 连接失败:", err) }
// 测试连接 err = Client.Ping(ctx, nil) if err != nil { log.Fatal("MongoDB Ping 失败:", err) }
// 获取数据库 DB = Client.Database("demo")
log.Println("MongoDB 初始化成功")}
func main() {
InitMongo()
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{ "message": "pong", })
})
r.Run(":8080")}URI 说明
| 参数 | 说明 |
|---|---|
| root | 用户名 |
| 123456 | 密码 |
| 127.0.0.1 | MongoDB 地址 |
| 27017 | MongoDB 默认端口 |
| ApplyURI | 设置连接地址 |
| SetMaxPoolSize | 最大连接池大小 |
| SetMinPoolSize | 最小连接池大小 |
| SetMaxConnIdleTime | 最大空闲连接时间 |
| SetConnectTimeout | 建立连接超时时间 |
| SetServerSelectionTimeout | 服务发现超时时间 |
| SetRetryWrites | 是否开启重试写 |
| SetRetryReads | 是否开启重试读 |
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 77 天
部分内容可能已过时