MySQL
Mysql şu anda en popüler açık kaynak ilişkisel veritabanıdır. Spesifik sql bilgileri burada ayrıntılı olarak anlatılmayacaktır. Eğer bilmiyorsanız lütfen önce kendi başınıza öğrenin. Bu makale sadece go kullanarak sql işlemlerinin nasıl yapılacağını basitçe açıklamaktadır. Projelerde genellikle doğrudan sürücü kullanılarak veritabanı işlemleri yapılmaz, bunun yerine ORM çerçeveleri kullanılır. Burada sqlx kütüphanesi kullanılmıştır. Bu kütüphane standart sql kütüphanesinin geliştirilmiş halidir. ORM kadar zengin özelliklere sahip değildir ancak sadeliği ile öne çıkar. Eğer ORM kullanmak isterseniz, Gorm, Xorm, Ent gibi kütüphaneleri inceleyebilirsiniz.
Bağımlılıklar
sqlx kütüphanesini indirin:
$ go get github.com/jmoiron/sqlxsqlx veya standart kütüphane database/sql sadece MySQL'i desteklemez. driver.Driver arayüzünü uygulayan herhangi bir tür desteklenir. Örneğin:
- PostgreSQL
- Oracle
- MariaDB
- SQLite
- Diğer ilişkisel veritabanları
İlgili veritabanını kullanmak için veritabanı sürücüsünün uygulanması gerekir. Sürücü kendi yazdığınız veya üçüncü taraf bir kütüphane olabilir. Kullanmadan önce sql.Register ile sürücüyü kaydetmeniz gerekir, ancak genellikle indirilen sürücü kütüphaneleri sürücüyü otomatik olarak kaydeder, manuel olarak kaydetmenize gerek kalmaz.
func Register(name string, driver driver.Driver)MySQL oldukça popüler ve en basit olduğu için bu makalede MySQL kullanılarak açıklanacaktır. Diğer ilişkisel veritabanları da büyük ölçüde benzer şekilde çalışır. MySQL sürücü kütüphanesini indirin:
$ go get github.com/go-sql-driver/mysqlVeritabanına Bağlanma
sqlx.Open fonksiyonu ile bir veritabanı bağlantısı açabilirsiniz. İki parametre alır: ilki sürücü adı, ikincisi veri kaynağıdır (genellikle DSN olarak adlandırılır).
func Open(driverName, dataSourceName string) (*DB, error)Sürücü adı, kayıtlı sürücü ile aynı olmalıdır. DSN ise veritabanının bağlantı adresidir. Her veritabanı için farklı olabilir. MySQL için aşağıdaki gibidir:
db,err := sqlx.Open("mysql","root:123456@tcp(127.0.0.1:3306)/test")Veri Hazırlama
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;Sorgulama
Sorgulama yapın ve sonuçları struct'a eşleyin:
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
// Tekil sorgu için Get, çoklu sorgu için Select kullanılır
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)
}Ekleme
Veri ekleyin:
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)
}Güncelleme
Veri güncelleyin:
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")
}Silme
Veri silin:
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")
}İşlemler (Transactions)
func (db *DB) Begin() (*Tx, error) // Bir işlem başlat
func (tx *Tx) Commit() error // Bir işlemi onayla
func (tx *Tx) Rollback() error // Bir işlemi geri alBir işlem başlatıldığında, güvenlik için genellikle defer tx.Rollback() eklenir. Eğer işlem sırasında hata oluşursa, geri alınır. İşlem başarıyla onaylanırsa, bu geri alma doğal olarak geçersiz olur.
func main() {
transation, err := db.Begin()
if err != nil {
fmt.Println("transation err")
}
defer transation.Rollback()
insert()
query()
update()
query()
delete()
transation.Commit()
}