コンテンツ
1.gormの紹介
GORMは、現在Golangで最も人気のあるデータベースORM操作ライブラリです。開発者にも優しいです。非常に便利で使いやすいです。主に構造体タイプとデータベーステーブルレコードのマッピングに使用されます。データベースを操作する場合は、 Sqlコードを直接記述する必要はありません。ここでは主にMySQLデータベースを紹介します。
GORMライブラリのgithubアドレス:https ://github.com/go-gorm/gorm
第二に、gormのインストール
MySQLを操作するには、次の2つのパッケージをインストールする必要があります。
- MySQLドライバーパッケージ
- GORMパッケージは、gogetコマンドを使用して依存関係をインストールします
//安装MySQL驱动
go get -u gorm.io/driver/mysql
//安装gorm包
go get -u gorm.io/gorm
パッケージをインポート
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
3、gormモデルの定義
1.ORMの概要
ORMフレームワークでは、データベースを操作するために事前定義されたモデルが必要です。このモデルは、データベースを操作するための媒体としてのデータモデルとして理解できます。
の間に。
例えば:
- データベースから読み取られたデータは、最初に事前定義されたモデルオブジェクトに保存され、次にモデルオブジェクトから必要なデータを取得できます。
- データベースにデータを挿入することは、最初に新しいモデルオブジェクトを作成し、次に保存するデータをモデルオブジェクトに保存してから、モデルオブジェクトをデータベースに保存することでもあります。
golangでは、gormモデル定義はstructを介して実装されるため、gormライブラリを介してstructtypeとmysqlテーブルデータ間のマッピングを実装できます。
ヒント:gormは、モデルの読み取りおよび書き込み操作をSQLステートメントに変換し、SQLステートメントの実行後にデータベースから返された結果を定義したモデルオブジェクトに変換します。
2、gormモデルの定義
gormモデルの定義は、主に構造体タイプの定義にフィールドラベルを追加して、実装を説明することです。以下の完全な例を見てみましょう。商品表がある場合、表の構成は次のようになります。
CREATE TABLE `food` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID,商品Id',
`name` varchar(30) NOT NULL COMMENT '商品名',
`price` decimal(10,2) unsigned NOT NULL COMMENT '商品价格',
`type_id` int(10) unsigned NOT NULL COMMENT '商品类型Id',
`createtime` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
モデルは次のように定義されます
//字段注释说明了gorm库把struct字段转换为表字段名长什么样子。
type Food struct {
Id int //表字段名为:id
Name string //表字段名为:name
Price float64 //表字段名为:price
TypeId int //表字段名为:type_id
//字段定义后面使用两个反引号``包裹起来的字符串部分叫做标签定义,这个是golang的基础语法,不同的库会定义不同的标签,有不同的含义
CreateTime int64 `gorm:"column:createtime"` //表字段名为:createtime
}
デフォルトでは、gormは構造体フィールド名にスネークケースの命名スタイルを使用してmysqlテーブルフィールド名に変換します(小文字に変換する必要があります)。
gormのデフォルトの規則によれば、上記の例では、gorm: "column:createtime"タグを使用してCreateTimeフィールドのテーブルフィールド名を定義し、その他のフィールドにはデフォルト値を使用するだけで済みます。
ヒント:スネークケースの命名スタイルは、各単語をアンダースコア(_)で区切ることです。例:CreateTimeのスネークケーススタイルの名前はcreate_timeです。
3.gormモデルラベル
上記の例から、gorm: "column:createtime"のようなタグ定義構文を使用して、構造体フィールドの列名(テーブルフィールド名)を定義できることがわかります。
gorm标签语法:gorm:"标签定义"
ラベル定義セクションでは、たとえば列名を定義するために、複数のラベル定義をセミコロン(;)で区切ることができます。
gorm:"column:列名"
一般的に使用されるgormのタグは次のとおりです。
ラベル |
説明する |
例 |
桁 |
列名を指定する |
gorm: "column:createtime" |
primaryKey |
主キーを指定します |
gorm: "column:id; PRIMARY_KEY" |
- |
フィールドを無視する |
gorm: "-"は構造体フィールドを無視でき、無視されたフィールドはgormの読み取りおよび書き込み操作に参加しません |
4.テーブル名を定義します
構造体タイプのTableName関数を定義することにより、モデルのテーブル名を定義できます。
上記の例を見てください:
//设置表名,可以通过给Food struct类型定义 TableName函数,返回一个字符串作为表名
func (v Food) TableName() string {
return "food"
}
提案:デフォルトでは、テーブル名はモデルに対して定義されています。定義モデルは、手書きのSQLクエリの結果を受け取るためにのみ使用される場合があります。この場合、テーブル名を定義する必要はありません。手動でテーブル名を指定します。 gorm関数Table()であり、どちらもモデルに対してTableName関数を定義する必要はありません。
5、gorm.Model
GORMは、フィールドID、CreatedAt、UpdatedAt、DeletedAtを含むgorm.Model構造を定義します。
// gorm.Model 的定义
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
それを構造に埋め込むために、継承の効果と同様に、これらのフィールドを含めることができます。
type User struct {
gorm.Model // 嵌入gorm.Model的字段
Name string
}
6.自動更新時間
GORM規則では、CreatedAt、UpdatedAtを使用して、作成/更新時間を追跡します。このようなフィールドが定義されている場合、GORMは、フィールドが作成または更新されたときに現在の時刻を自動的に入力します。
異なる名前のフィールドを使用するには、autoCreateTime、autoUpdateTimeタグを構成できます
時間の代わりにUNIX(milli / nano)の2番目のタイムスタンプを保存する場合は、time.Timeをintに変更するだけです。
例:
type User struct {
CreatedAt time.Time // 默认创建时间字段, 在创建时,如果该字段值为零值,则使用当前时间填充
UpdatedAt int // 默认更新时间字段, 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充
Updated int64 `gorm:"autoUpdateTime:nano"` // 自定义字段, 使用时间戳填纳秒数充更新时间
Updated int64 `gorm:"autoUpdateTime:milli"` //自定义字段, 使用时间戳毫秒数填充更新时间
Created int64 `gorm:"autoCreateTime"` //自定义字段, 使用时间戳秒数填充创建时间
}
4、gorm接続データベース
gormはさまざまなデータベースをサポートしています。ここでは主にmysqlを紹介しています。mysqlを接続するには、主に2つの手順があります。
1)DSN(データソース名)を構成します
2)gorm.Openを使用してデータベースに接続します
1. DSN(データソース名)を構成します
gormライブラリは、データベースに接続するためのパラメータとしてdsnを使用します。dsnは、変換時にデータソース名と呼ばれ、データベース接続情報を記述するために使用されます。通常、データベース接続アドレス、アカウント番号、パスワード、およびその他の情報が含まれています。
DSN形式:
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
mysql接続dsnの例:
//mysql dsn格式
//涉及参数:
//username 数据库账号
//password 数据库密码
//host 数据库连接地址,可以是Ip或者域名
//port 数据库端口
//Dbname 数据库名
username:password@tcp(host:port)/Dbname?charset=utf8&parseTime=True&loc=Local
//填上参数后的例子
//username = root
//password = 123456
//host = localhost
//port = 3306
//Dbname = tizi365
//后面K/V键值对参数含义为:
// charset=utf8 客户端字符集为utf8
// parseTime=true 支持把数据库datetime和date类型转换为golang的time.Time类型
// loc=Local 使用系统本地时区
root:123456@tcp(localhost:3306)/tizi365?charset=utf8&parseTime=True&loc=Local
//gorm 设置mysql连接超时参数
//开发的时候经常需要设置数据库连接超时参数,gorm是通过dsn的timeout参数配置
//例如,设置10秒后连接超时,timeout=10s
//下面是完成的例子
root:123456@tcp(localhost:3306)/tizi365?charset=utf8&parseTime=True&loc=Local&timeout=10s
//设置读写超时时间
// readTimeout - 读超时时间,0代表不限制
// writeTimeout - 写超时时间,0代表不限制
root:123456@tcp(localhost:3306)/tizi365?charset=utf8&parseTime=True&loc=Local&timeout=10s&readTimeout=30s&writeTimeout=60s
2.gorm.Openを使用してデータベースに接続します
上記で構成されたdsnパラメーターを使用すると、gormを使用してデータベースに接続できます。以下は、データベースへの接続の例です。
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
//配置MySQL连接参数
username := "root" //账号
password := "123456" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "tizi365" //数据库名
timeout := "10s" //连接超时,10秒
//拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
//延时关闭数据库连接
defer db.Close()
}
3.gormデバッグモード
デバッグを容易にし、gorm操作によって実行されるSQLステートメントの種類を理解するには、開発中にデバッグログを開いて、実行された各SQLステートメントをgormが出力するようにする必要があります。
デバッグ機能を使用してクエリを実行します
result := db.Debug().Where("username = ?", "tizi365").First(&u)
4.gorm接続プール
同時実行性の高いプラクティスでは、データベース接続の使用率を向上させ、データベース接続の繰り返し確立によるパフォーマンスの消費を回避するために、データベース接続プーリングテクノロジを使用してデータベース接続を維持することがよくあります。
gormにはデータベース接続プールが付属しています。これは非常に使いやすく、データベース接続プールのパラメーターを設定するだけです。
データベース接続プールの使用例:
データベースの初期化を担当するツールパッケージを定義します(注:接続プールの説明を使用すると、通常、データベースを操作するときに、データベース接続を個別にパッケージにカプセル化できます)
//定义一个工具包,用来管理gorm数据库连接池的初始化工作。
package tools
//定义全局的db对象,我们执行数据库操作主要通过他实现。
var _db *gorm.DB
//包初始化函数,golang特性,每个包初始化的时候会自动执行init函数,这里用来初始化gorm。
func init() {
...忽略dsn配置,请参考上面例子...
// 声明err变量,下面不能使用:=赋值运算符,否则_db变量会当成局部变量,导致外部无法访问_db变量
var err error
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
_db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
sqlDB, _ := db.DB()
//设置数据库连接池参数
sqlDB.SetMaxOpenConns(100) //设置数据库连接池最大连接数
sqlDB.SetMaxIdleConns(20) //连接池最大允许的空闲连接数,如果没有sql任务需要执行的连接数大于20,超过的连接会被连接池关闭。
}
//获取gorm db对象,其他包需要执行数据库查询的时候,只要通过tools.getDB()获取db对象即可。
//不用担心协程并发使用同样的db对象会共用同一个连接,db对象在调用他的方法的时候会从数据库连接池中获取新的连接
func GetDB() *gorm.DB {
return _db
}
使用例:
package main
//导入tools包
import tools
func main() {
//获取DB
db := tools.GetDB()
//执行数据库查询操作
u := User{}
//自动生成sql: SELECT * FROM `users` WHERE (username = 'tizi365') LIMIT 1
db.Where("username = ?", "tizi365").First(&u)
}
注:接続プールテクノロジーを使用した後、dbを使用した後にdb.Closeを呼び出してデータベース接続を閉じないでください。データベース接続プール全体が閉じられ、接続プールで使用可能な接続がなくなります。