1. GORMを始める
1.1 ORMとは?
orm
はソフトウェアではなく用語です
- ormの完全な英語名はオブジェクト リレーショナル マッピングであり、オブジェクト マッピング関係です。
- 簡単に言えば、 pythonのようなオブジェクト指向プログラムではすべてがオブジェクトですが、使用するデータベースはすべてリレーショナルです
- 一貫した使用習慣を確保するために、プログラミング言語のオブジェクト モデルとデータベースのリレーショナル モデルはormを介してマッピングされるため、 SQLを直接使用する代わりに、プログラミング言語のオブジェクト モデルを直接使用してデータベースを操作できます。言語
golang の orm フレームワークを使用することは、golang の構造体、つまりデータベースの構造体とテーブル フィールドをマップすることです。つまり、データベースを操作することは、データベースを直接操作することではなく、構造を通して操作することです。もちろん、ここではデータベース関連の sdk を使用します。
全体として、構造を操作することによってデータベースを操作でき、構造を操作することによって、テーブル内のデータが実際にそれに応じて変更されます。
orm フレームワークの主な機能は、go では構造体であり、実際には Java ではクラスであること、つまり、オブジェクトとテーブルの間のマッピング関係を作成することです. テーブルを操作する必要はなく、単に操作するだけです.オブジェクトを直接。
1.2ゴームとは?
参考資料:
https://gorm.io/zh_CN/docs/index.html
GORM は、
Golang用の
驚くほど開発者に優しいORM
ライブラリです。
- フル機能のORM (ほぼすべての機能が含まれています)
- モデルの関連付け( 1 対 1、1 対多、1 対多 (逆)、多対多、多態的関連付け)
- 钩子(Before/After Create/Save/Update/Delete/Find)
- プリロード
- 事務
- 複合主キー
- SQLコンストラクター
- 自動移行
- ログ
- GORMコールバックに基づく拡張可能なプラグインの作成
- 全機能のテスト カバレッジ
- 開発者に優しい
1.3 GORM (v2)の基本的な使い方
1.
インストール
go get -u gorm.io/gorm
2.MySQLに接続する
最初にデータベースを作成する
mysql> create database test_db charset utf8; # 创建数据库
mysql> use test_db; # 切换到数据库
mysql> show tables; # 查看是否生成表
+-------------------+
| Tables_in_test_db |
+-------------------+
| users |
+-------------------+
mysql> desc users; # 查看表的字段是否正常
+----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| username | longtext | YES | | NULL | |
| password | longtext | YES | | NULL | |
+----------+------------+------+-----+---------+----------------+
mysql接続
を作成します
。次のドキュメントを参照してください:
https://gorm.io/zh_CN/docs/connecting_to_the_database.html
インポートしたパッケージを使用しない場合は、次のように先頭に _ を追加します。
import _"gorm.io/driver/mysql"
このパッケージを使用しないのに、なぜそれをインポートするのですか? インポートして使用しない場合は、パッケージ内の init 関数を実行するということですが、実際には内部で init を実行するということです。
parseTime 解析時間: Gorm には、作成時間、更新時間、および削除時間があります。写像関係を行う場合、取得時の時刻オブジェクトであり、ここで自動的に時刻オブジェクトに変換されます。
loc=Local: ローカル環境のタイムゾーンを使用
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
//这是固定写法
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
fmt.Println(db)
}
3.
テーブルの自動作成
参照ドキュメント:
https://gorm.io/zh_CN/docs/models.html
これは実際には開発では使用されませんが、事前にテーブルを作成し、構造タグを使用するのではなく、自分でデータベースにインデックスを作成するために使用されます。
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
Id int64 `gorm:"primary_key" json:"id"`
Username string
Password string
}
func main() {
dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println(err)
}
//自动迁移
err = db.AutoMigrate(User{})
if err != nil {
fmt.Println(err)
}
}
mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| users |
+-------------------+
1 row in set (0.00 sec)
mysql> desc users;
+----------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+----------------+
| id | bigint | NO | PRI | NULL | auto_increment |
| username | longtext | YES | | NULL | |
| password | longtext | YES | | NULL | |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
4.基本的な CRUD
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
//自定义返回表名
func (* User) TableName() string {
return "user"
}
// User 表的结构体ORM映射
type User struct {
Id int64 `gorm:"primary_key" json:"id"`
Username string
Password string
}
func main() {
// 0、连接数据库
dsn := "root:1@tcp(127.0.0.1:3306)/test_db?
charset=utf8mb4&parseTime=True&loc=Local"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
db.AutoMigrate(User{})
// 1、增
db.Create(&User{
//Id: 3,
Username: "zhangsan",
Password: "123456",
})
// 2、改
db.Model(User{Id: 3,}).Update("username", "lisi")
//db.Model(User{}).Where("id = 1").Update("username", "lisi")
// 3、查
// 3.1 过滤查询
u := User{Id: 3}
db.First(&u)
fmt.Println(u)
// 3.2 查询所有数据
users := []User{}
db.Find(&users)
fmt.Println(users) // [{2 zhangsan 123456} {3 lisi 123456}]
// 4、删
// 4.1 删除 id = 3 的用户
db.Delete(&User{Id: 3})
// 4.2 条件删除
db.Where("username = ?", "zhangsan").Delete(&User{})
}
上記で使用されているすべての構造は、そのテーブルに関連しています。
すべてのデータを照会します。
var users []User
db.Find(&users)
fmt.Println(users)
2. モデル定義
参照ドキュメント: https://gorm.io/zh_CN/docs/models.html
1.
モデル定義
モデルは通常、通常の
Golang
構造体、
Go の
基本データ型、またはポインターです。
例:
ここでの id は実際には主キーであり、主キーは自動インクリメントでき、繰り返すことはできません。
CreatedAt
*
time
.
Time
`json:"createdAt" gorm:"column:create_at"`
作成時にこのフィールドを渡す必要はありません。作成した時間が自動的に追加されます。テーブルに作成されるフィールドは
create_at と呼ばれます。
mysql でテーブルを作成して設計し、戻って gorm の操作を行うことをお勧めします。これらは、データベースの一番下に直接行うことができます. 上記のように混乱して書き込むことはお勧めできません.
2.
サポート構造タグ
モデルを宣言するとき、ラベルはオプションのマークアップです
上記はデータベースで直接制限されています。