# 連接到數據庫
GORM 官方支持的數據庫類型有: MySQL, PostgreSQL, SQlite, SQL Server
## MySQL
```go
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 參考 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{})
}
```
**注意:**
想要 Gorm 正確的處理 `time.Time` ,您需要帶上 `parseTime` 參數。 ([查看更多參數](https://github.com/go-sql-driver/mysql#parameters))
想要支持完整的 UTF-8 編碼,您需要將 `charset=utf8` 更改為 `charset=utf8mb4`。 查看 [此文章](https://mathiasbynens.be/notes/mysql-utf8mb4) 獲取詳情
MySQl 驅動程序提供了 [一些高級配置](https://github.com/go-gorm/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, // 根據版本自動配置
}), &gorm.Config{})
```
## PostgreSQL
```go
import (
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
dsn := "user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
```
我們使用 [pgx](https://github.com/jackc/pgx) 作為 postgres 的 database/sql 驅動器,默認情況下,它會啟用 prepared statement 緩存,你可以這樣禁用它:
```go
// https://github.com/go-gorm/postgres
db, err := gorm.Open(postgres.New(postgres.Config{
DSN: "user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai",
PreferSimpleProtocol: true, // 禁用隱式 prepared statement
}), &gorm.Config{})
```
## SQLite
```go
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
// github.com/mattn/go-sqlite3
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
```
**注意:** 您也可以使用 `file::memory:?cache=shared` 替代文件路徑。 這會告訴 SQLite 在系統內存中使用一個臨時數據庫。 (查看 [SQLite 文檔](https://www.sqlite.org/inmemorydb.html) 獲取詳情)
## SQL Server
```go
import (
"gorm.io/driver/sqlserver"
"gorm.io/gorm"
)
// github.com/denisenkom/go-mssqldb
dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"
db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})
```
Microsoft 為 GO (GORM) 使用 SQL Server 提供了 [一份指南](https://sqlchoice.azurewebsites.net/en-us/sql-server/developer-get-started/)
## 連接池
GORM 使用 [database/sql](https://pkg.go.dev/database/sql) 來維護連接池
```
sqlDB, err := db.DB()
// SetMaxIdleConns 設置空閑連接池中連接的最大數量
sqlDB.SetMaxIgleConns(10)
// SetMaxOpenConns 設置打開數據庫連接的最大數量
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 設置了連接可復用的最大時間
sqlDB.SetConnMaxLifetime(time.Hour)
```
查看 [通用接口](../教程/generic_interface.md) 獲取詳情。
## 不支持的數據庫
有些數據庫可能兼容 `mysql`、`postgres` 的方言,在這種情況下,你可以直接使用這些數據庫的方言。
對于其它不支持的數據,[我們鼓勵且歡迎大家伙開發更多數據庫類型的驅動!](../高級/write_driver.md)