【Gorm】连接到数据库

  • DSN(Data Source Name)是一个字符串,用来告诉数据库驱动如何连接到数据库。理解 DSN 的构成有助于正确配置和调试数据库连接。

    • 用户名和密码
      • 示例(MySQL)user:pass
        • user:连接数据库的用户名。
        • pass:对应用户的密码。
    • 地址和端口
      • 示例(MySQL)@tcp(127.0.0.1:3306)
        • 127.0.0.1:数据库服务器地址,通常为 IP 地址或域名。
        • 3306:数据库服务端口,MySQL 默认端口是 3306。
    • 数据库名称
      • 示例(MySQL)/dbname
        • dbname:要连接的具体数据库名称。
    • 附加参数
      • 参数以问号 ? 开始,通过 & 分隔多个键值对。
      • 常见参数包括:
        • charset:指定字符集,如 charset=utf8mb4,保证支持完整的 UTF-8 编码。
        • parseTime:如 parseTime=True,表示自动解析数据库中的时间字段为 Go 的 time.Time 类型。
        • loc:如 loc=Local,设置时区为本地时区,确保时间数据正确处理。
  • 数据库驱动:

    • 简单来说,数据库驱动就像不同国家的翻译官,帮助你的程序把通用的数据库操作指令“翻译”为具体数据库能理解的话,从而实现数据的存取和操作。
  • 支持的数据库类型

    • GORM 官方支持 MySQL、PostgreSQL、SQLite、SQL Server、TiDB 等多种数据库,还有第三方支持 Clickhouse 等数据库。
  • 连接数据库的基本方式

    • 导入对应驱动包:根据目标数据库选择对应的驱动包,例如 MySQL 使用 "gorm.io/driver/mysql"、PostgreSQL 使用 "gorm.io/driver/postgres"、SQLite 使用 "gorm.io/driver/sqlite" 等。

    • 构造 DSN(Data Source Name)字符串:DSN 字符串包含用户名、密码、数据库地址、端口、数据库名、字符集、时区以及其他参数。

      • 例如,对于 MySQL:

        // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
        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{})
        
      • 对于 PostgreSQL:

        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{})
        
    • 使用现有数据库连接:可以先使用标准库 database/sql 获取一个 sql.DB 对象,再将其传入 GORM 进行初始化。

      sqlDB, err := sql.Open("pgx", "mydb_dsn")
      gormDB, err := gorm.Open(postgres.New(postgres.Config{
        Conn: sqlDB,
      }), &gorm.Config{})
      
  • 高级配置选项

    • 不同驱动支持一些额外的高级配置参数,例如:

      • MySQL:可以设置默认字符串长度、禁用 datetime 精度(适用于旧版本 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{})
        
      • PostgreSQL:支持使用 pgx 驱动,并可设置是否启用 prepared statement 缓存。

        db, err := gorm.Open(postgres.New(postgres.Config{
          DSN: "user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai",
          PreferSimpleProtocol: true, // disables implicit prepared statement usage
        }), &gorm.Config{})
        
      • TiDB:支持特定的标签如 default:auto_random() 来调用 TiDB 的自动随机主键功能,以及注意特定版本支持 SAVEPOINT、FOREIGN KEY 等功能。

    • 连接池管理:GORM 内部基于 database/sql 维护连接池,允许设置最大空闲连接数、最大打开连接数和连接的最大重用时间:

      sqlDB, _ := db.DB()
      sqlDB.SetMaxIdleConns(10)
      sqlDB.SetMaxOpenConns(100)
      sqlDB.SetConnMaxLifetime(time.Hour)
      
  • 自定义驱动

    • GORM 允许通过 DriverName 选项来自定义驱动名称,从而使用其他第三方驱动。
    import (
      _ "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/postgres"
      "gorm.io/gorm"
    )
    
    db, err := gorm.Open(postgres.New(postgres.Config{
      DriverName: "cloudsqlpostgres",
      DSN: "host=project:region:instance user=postgres dbname=postgres password=password sslmode=disable",
    })
    
### 使用 GORM 连接数据库的方法与配置 GORM 是一个功能强大的 ORM 库,支持多种主流关系型数据库。以下是关于如何使用 GORM 连接数据库的具体方法和配置说明: --- #### 1. **安装依赖** 在开始之前,需要确保已安装 `gorm` 和对应数据库驱动程序的依赖包。例如,连接 MySQL 数据库时,可运行以下命令安装必要的依赖项: ```bash go get -u gorm.io/gorm go get -u gorm.io/driver/mysql ``` 对于其他数据库(如 PostgreSQL、SQLite 或 SQL Server),只需替换相应的驱动即可。 --- #### 2. **基本连接流程** ##### (1)**MySQL 数据库连接** 下面是一个完整的示例代码,展示如何通过 GORM 配置并连接到 MySQL 数据库[^2]: ```go package main import ( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" ) func main() { dsn := "root:root@(localhost:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { fmt.Println("数据库连接失败:", err) return } fmt.Println("数据库连接成功!") defer db.Close() } ``` - 参数解释: - 用户名:`root` - 密码:`root` - 主机地址:`(localhost)` - 端口:隐含于主机地址中,默认为 `3306` - 数据库名称:`test_db` - 其他选项:`charset=utf8mb4&parseTime=True&loc=Local` 表示字符集设置以及时间解析规则[^2]。 --- ##### (2)**PostgreSQL 数据库连接** 同样地,可以按照如下方式连接 PostgreSQL 数据库[^2]: ```go package main import ( "fmt" "gorm.io/driver/postgres" "gorm.io/gorm" ) func main() { dsn := "host=localhost user=root password=root dbname=test_db port=5432 sslmode=disable TimeZone=Asia/Shanghai" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { fmt.Println("数据库连接失败:", err) return } fmt.Println("数据库连接成功!") defer db.Close() } ``` - 参数解释: - `host`: 数据库服务器地址。 - `user`, `password`: 登录凭证。 - `dbname`: 要连接的目标数据库名称。 - `port`: 默认端口号为 `5432`。 - `sslmode`: 是否启用 SSL 加密通信。 - `TimeZone`: 设置时区信息。 --- ##### (3)**SQLite 数据库连接** 如果需要轻量级本地存储,可以选择 SQLite 数据库[^2]: ```go package main import ( "fmt" "gorm.io/driver/sqlite" "gorm.io/gorm" ) func main() { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { fmt.Println("数据库连接失败:", err) return } fmt.Println("数据库连接成功!") defer db.Close() } ``` 此处无需复杂的 DSN 字符串,仅需提供文件路径即可完成连接。 --- ##### (4)**SQL Server 数据库连接** 针对 Microsoft SQL Server 的连接示例如下: ```go package main import ( "fmt" "gorm.io/driver/sqlserver" "gorm.io/gorm" ) func main() { dsn := "sqlserver://sa:your_password@localhost:1433?database=test_db" db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{}) if err != nil { fmt.Println("数据库连接失败:", err) return } fmt.Println("数据库连接成功!") defer db.Close() } ``` --- #### 3. **高级配置** 除了基础连接外,还可以进一步优化 GORM 的行为。例如,可以通过传递自定义配置对象调整日志级别或禁用外键约束等[^4]: ```go db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) if err != nil { panic(err) } ``` --- #### 4. **执行原始 SQL 查询** 一旦建立了有效的数据库连接,就可以轻松执行复杂查询操作。例如,查询表中的所有记录[^4]: ```go type User struct { ID uint Name string Age int } var users []User result := db.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users) if result.Error != nil { fmt.Println(result.Error) } else { fmt.Println(users) } ``` --- #### 总结 以上介绍了基于 GORM 实现不同数据库连接的核心方法及其扩展应用。无论是简单的 CRUD 操作还是更深层次的数据交互需求,均可借助这一工具高效达成目标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值