在 GORM 中使用 Microsoft SQL Server 数据库时,需要通过官方提供的 gorm.io/driver/sqlserver 驱动进行连接。以下是详细的使用指南和示例代码:
1. 安装驱动
在项目中导入 SQL Server 驱动:
go get gorm.io/driver/sqlserver
go get gorm.io/gorm
2. 连接数据库
基本连接格式
SQL Server 的连接字符串(DSN)通常包含以下参数:
server: 服务器地址(含端口,默认1433)user id: 用户名password: 密码database: 数据库名
import (
    "gorm.io/driver/sqlserver"
    "gorm.io/gorm"
)
func main() {
    // DSN 格式: sqlserver://username:password@host:port?database=dbname
    dsn := "sqlserver://sa:your_password@localhost:1433?database=gorm_db"
    db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("Failed to connect to SQL Server")
    }
}
3. 配置选项
(1) 自定义连接参数
通过 DSN 添加额外参数(如加密、超时等):
dsn := "sqlserver://sa:your_password@localhost:1433?database=gorm_db&encrypt=disable&connection+timeout=30"
(2) GORM 配置
启用日志、跳过默认事务等:
db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{
    Logger: logger.Default.LogMode(logger.Info), // 打印 SQL 日志
    SkipDefaultTransaction: true,               // 禁用默认事务
})
4. CRUD 操作示例
(1) 定义模型
type User struct {
    ID       uint   `gorm:"primaryKey"`
    Name     string `gorm:"size:50"`
    Age      int
}
(2) AutoMigrate (自动迁移表)
db.AutoMigrate(&User{}) // 创建或更新表结构
(3) Insert (插入数据)
user := User{Name: "Alice", Age: 25}
result := db.Create(&user)
if result.Error != nil {
    panic(result.Error)
}
(4) Query (查询数据)
var users []User
db.Where("age > ?", 20).Find(&users)
5. SQL Server特有功能支持
(1) JSON/Array类型字段
如果使用 SQL Server JSON/Array,需手动处理序列化:
type Product struct {
    Attributes datatypes.JSON `json:"attributes"` // gorm.io/datatypes.JSON 
}
// JSON字段写入/读取示例:
product := Product{Attributes: datatypes.JSON(`{"color": "red"}`)}
db.Create(&product)
(2) OpenQuery/LinkedServer调用
通过 Raw SQL:
db.Raw("SELECT * FROM OPENQUERY(linked_server, 'SELECT * FROM remote_table')").Scan(&results)
6.注意事项
- 身份验证模式:确保服务器启用了混合认证(SQL + Windows)。
 - 端口与防火墙:默认端口为 
1433,需开放防火墙。 - GORM版本兼容性:建议使用最新版 GORM (
v1.25+)。 - 批量插入优化:SQL Server的批量插入可能需要调整批大小:
db.CreateInBatches(users, batchSize) 
如果需要更复杂的操作(如存储过程调用),可以直接使用原生 SQL:
db.Raw("EXEC sp_my_procedure @param1 = ?", value).Scan(&result)
遇到具体问题时,可以提供更多细节进一步讨论!
内容由零声教学AI助手提供,问题来源于学员提问


        
        
        
        
        
        
        
        
        
                
                
                
                
                
                
                