1. GORM Dialects

1.1. 编写一个新的 Dialect

GORM 原生支持 sqlite, mysql, postgres 和 mssql。

你可以通过实现 dialect interface 接口,来新增对某个新的数据库的支持。

有一些关系型数据库与 mysql 和 postgres 语法兼容,因此你可以直接使用这两个数据库的 dialect 。

1.2. Dialect 专属的数据类型

一些 SQL 语法的 dialects 支持他们自定义的,非标准的字段类型,如 PostgreSQL 中的 jsonb 字段类型。GORM 支持一些类似此种类型,下面是这些类型的简单实用范例。

1.2.1. PostgreSQL

GORM 支持 PostgreSQL 专有的字段类型:

  • jsonb
  • hstore

以下这是 Model 的定义:

  1. import (
  2. "encoding/json"
  3. "github.com/jinzhu/gorm/dialects/postgres"
  4. )
  5. type Document struct {
  6. Metadata postgres.Jsonb
  7. Secrets postgres.Hstore
  8. Body string
  9. ID int
  10. }

你可以这样子使用 Model:

  1. password := "0654857340"
  2. metadata := json.RawMessage(`{"is_archived": 0}`)
  3. sampleDoc := Document{
  4. Body: "This is a test document",
  5. Metadata: postgres.Jsonb{ metadata },
  6. Secrets: postgres.Hstore{"password": &password},
  7. }
  8. // 将范例数据写入数据库
  9. db.Create(&sampleDoc)
  10. // 读取数据,来检测是否正确写入
  11. resultDoc := Document{}
  12. db.Where("id = ?", sampleDoc.ID).First(&resultDoc)
  13. metadataIsEqual := reflect.DeepEqual(resultDoc.Metadata, sampleDoc.Metadata)
  14. secretsIsEqual := reflect.DeepEqual(resultDoc.Secrets, resultDoc.Secrets)
  15. // 应该打印 "true"
  16. fmt.Println("Inserted fields are as expected:", metadataIsEqual && secretsIsEqual)