使用GORM连接SQL Server实现增删改查
下面是一个完整的示例,展示如何使用gorm.io/driver/sqlserver
驱动连接SQL Server数据库并实现基本的CRUD操作。
1. 安装依赖
首先确保安装了必要的依赖:
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlserver
2. 基本代码实现
package main
import (
"fmt"
"log"
"time"
"gorm.io/driver/sqlserver"
"gorm.io/gorm"
)
// 定义模型结构体
type Product struct {
gorm.Model // 包含ID, CreatedAt, UpdatedAt, DeletedAt字段
Name string `gorm:"size:100"`
Price float64
Stock int
}
func main() {
// SQL Server连接字符串格式:
// sqlserver://username:password@host:port?database=dbname&encrypt=disable
dsn := "sqlserver://sa:your_password@localhost:1433?database=gorm_test&encrypt=disable"
db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("Failed to connect to database:", err)
}
fmt.Println("Successfully connected to SQL Server!")
// 自动迁移表结构(创建或更新表)
err = db.AutoMigrate(&Product{})
if err != nil {
log.Fatal("AutoMigrate failed:", err)
}
// CRUD操作示例
// Create (创建)
newProduct := Product{
Name: "Laptop",
Price: 999.99,
Stock: 10,
}
result := db.Create(&newProduct)
if result.Error != nil {
log.Fatal("Create failed:", result.Error)
}
fmt.Printf("Created product with ID: %d\n", newProduct.ID)
// Read (查询单个记录)
var product Product
db.First(&product, newProduct.ID) // 根据主键查找
fmt.Printf("Found product: %+v\n", product)
// Read (查询多个记录)
var products []Product
db.Where("price > ?", 500).Find(&products) // 条件查询
fmt.Println("Expensive products:")
for _, p := range products {
fmt.Printf("- %s ($%.2f)\n", p.Name, p.Price)
}
// Update (更新)
db.Model(&product).Update("Price", 899.99) // 更新单个字段
db.Model(&product).Updates(Product{Name: "Premium Laptop", Stock: 5}) // 更新多个字段
// Delete (删除 - GORM默认是软删除,只设置DeletedAt字段)
db.Delete(&product)
// Unscoped().Delete()可以物理删除记录
db.Unscoped().Delete(&product)
}
SQL Server特有注意事项
连接字符串:
- SQL Server的连接字符串格式为:
sqlserver://username:password@host:port?database=dbname
encrypt=disable
选项禁用SSL加密(仅用于开发环境)
- SQL Server的连接字符串格式为:
标识符大小写:
- SQL Server默认不区分大小写,但GORM生成的表名和列名会保持原样
自增主键:
- GORM的
gorm.Model
中的ID字段会自动映射到SQL Server的IDENTITY列
- GORM的
时间戳处理:
- SQL Server的datetime类型与Go的time.Time兼容
批量插入限制:
- SQL Server对单条INSERT语句有参数数量限制(约2100个),大批量插入时可能需要分批处理
事务处理: “`go tx := db.Begin() defer func() { if r := recover(); r != nil {
tx.Rollback()
} }()
if err := tx.Create(&product1).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Create(&product2).Error; err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error “`
这个示例展示了使用GORM与SQL Server交互的基本操作。你可以根据实际需求扩展模型和查询逻辑。
内容由零声教学AI助手提供,问题来源于学员提问