MySQL
MySQL は現在最も人気のあるオープンソースリレーショナルデータベースです。具体的な SQL 知識についてはここでは詳しく説明しません。もしわからない場合は、まず自行で学習してください。この記事では Go を使用して SQL 操作を行う方法を簡単に説明するだけです。プロジェクトでは通常、直接ドライバーを使用してデータベース操作を行うのではなく、ORM フレームワークを使用します。ここでは sqlx ライブラリを使用します。これは標準 sql ライブラリを拡張したもので、ORM 機能ほど豊富ではありませんが、簡潔さが売りです。ORM を使用したい場合は、Gorm、Xorm、Ent などのライブラリについて調べてください。
依存関係
sqlx ライブラリをダウンロードします。
$ go get github.com/jmoiron/sqlxsqlx または標準ライブラリ database/sql がサポートするデータベースは MySQL だけではありません。driver.Driver インターフェースを実装した任意のタイプがサポートされます。例えば:
- PostgreSQL
- Oracle
- MariaDB
- SQLite
- その他のリレーショナルデータベース
対応するデータベースを使用するには、データベースドライバーを実装する必要があります。ドライバーは自分で書いたものでも、サードパーティライブラリでも構いません。使用する前に sql.Register でドライバーを登録してから使用する必要があります。ただし、通常ダウンロードしたドライバーライブラリは自動的にドライバーを登録するため、手動で登録する必要はありません。
func Register(name string, driver driver.Driver)MySQL は比較的人気があり、最もシンプルでもあるため、この記事では MySQL を使用して説明します。他のリレーショナルデータベースの操作もほぼ同じです。MySQL ドライバーライブラリをダウンロードします。
$ go get github.com/go-sql-driver/mysqlデータベースへの接続
sqlx.Open 関数を通じて、データベース接続を開くことができます。これは 2 つのパラメータを受け取ります。1 つ目はドライバー名、2 つ目はデータソース(一般に DSN と略されます)です。
func Open(driverName, dataSourceName string) (*DB, error)ドライバー名はドライバー登録時に使用される名前で、一貫している必要があります。DSN はデータベースの接続アドレスで、データベースごとに異なる可能性があります。MySQL の場合は以下のようになります。
db,err := sqlx.Open("mysql","root:123456@tcp(127.0.0.1:3306)/test")データの準備
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`age` tinyint(0) NULL DEFAULT NULL,
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('12132', '张三', 35, '北京市');
INSERT INTO `user` VALUES ('16162', '王五', 22, '上海市');
SET FOREIGN_KEY_CHECKS = 1;クエリ
クエリを実行し、結果を構造体にマッピングします。
var db *sqlx.DB
type Person struct {
UserId string `db:"id"`
Username string `db:"name"`
Age int `db:"age"`
Address string `db:"address"`
}
func init() {
conn, err := sqlx.Open("mysql", "root:wyh246859@tcp(127.0.0.1:3306)/test")
if err != nil {
fmt.Println("Open mysql failed", err)
return
}
db = conn
}
func main() {
query()
defer db.Close()
}
func query() {
var person Person
//1 つ取得する場合は Get、複数取得する場合は Select
err := db.Get(&person, "select * from user where id = ?", "12132")
if err != nil {
fmt.Println("query failed:", err)
return
}
fmt.Printf("query succ:%+v", person)
}
func list() {
var perons []Person
err := db.Select(&perons, "select * from user")
if err != nil {
fmt.Println("list err", err)
return
}
fmt.Printf("list succ,%+v", perons)
}追加
データを追加します。
func insert() {
result, err := db.Exec("insert into user value (?,?,?,?)", "120230", "李四", 12, "広州市")
if err != nil {
fmt.Println("insert err:", err)
return
}
id, err := result.LastInsertId()
if err != nil {
fmt.Println("insert err:", err)
return
}
fmt.Println("insert succ:", id)
}更新
データを更新します。
func update() {
res, err := db.Exec("update user set name = ? where id = ?", "趙六", "120230")
if err != nil {
fmt.Println("update err:", err)
return
}
eff, err := res.RowsAffected()
if err != nil || eff == 0 {
fmt.Println("update err:", err)
return
}
fmt.Println("Update succ")
}削除
データを削除します。
func delete() {
res, err := db.Exec("delete from user where id = ?", "120230")
if err != nil {
fmt.Println("delete err:", err)
return
}
eff, err := res.RowsAffected()
if err != nil || eff == 0 {
fmt.Println("delete err:", err)
return
}
fmt.Println("delete succ")
}トランザクション
func (db *DB) Begin() (*Tx, error) // トランザクションを開始
func (tx *Tx) Commit() error // トランザクションをコミット
func (tx *Tx) Rollback() error // トランザクションをロールバックトランザクションを開始した後、安全のために defer tx.Rollback() を追加するのが一般的です。プロセスにエラーが発生した場合、ロールバックされます。トランザクションが正常にコミットされた場合、このロールバックは無効になります。
func main() {
transation, err := db.Begin()
if err != nil {
fmt.Println("transation err")
}
defer transation.Rollback()
insert()
query()
update()
query()
delete()
transation.Commit()
}