GORM - basic

Pooling

connection = [1]in use [2]not use & return to the pool

fail to release connections back to pool => running out of resources.

username:password@tcp(127.0.0.1:3001)/dbname

Don’t Open() and Close() databases frequently.

always prepare queries to be used multiple times = Prepared statements is better than concatenating strings (SQL injection)

GORM - psql

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/postgres"
)

func main() {
  db, err := gorm.Open(
    "postgres", 
    "host=myhost user=gorm dbname=gorm sslmode=disable password=mypassword"
  )
  defer db.Close()
}

GORM - sqlite

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
)

func main() {
  db, err := gorm.Open(
    "sqlite3", 
    "/tmp/gorm.db"
  )
  defer db.Close()
}

GORM - migrate

AutoMigrate: 只會創建table, row, index. 不會change type, delete.

// AutoMigrate
db.AutoMigrate(&User{})
// is Model `User` exist?
db.HasTable(&User{})

// is table `users` exist?
db.HasTable("users")
// create table
db.CreateTable(&User{})

// delete table
db.DropTable(&User{})

// delete tables: User & products
db.DropTableIfExists(&User{}, "products")
// modify column
db.Model(&User{}).ModifyColumn("description", "text")

// delete column
db.Model(&User{}).DropColumn("description")
// add foreign key
db.Model(&User{}).AddForeignKey("city_id", "cities(id)", "RESTRICT", "RESTRICT")
// add idx_user_name index @ name column
db.Model(&User{}).AddIndex("idx_user_name", "name")
db.Model(&User{}).AddUniqueIndex("idx_user_name", "name")

// add idx_user_name_age index @ name/age columns
db.Model(&User{}).AddIndex("idx_user_name_age", "name", "age")
db.Model(&User{}).AddUniqueIndex("idx_user_name_age", "name", "age")

// delete index
db.Model(&User{}).RemoveIndex("idx_user_name")

GORM - CRUD

// create
db.Create(&Product{Code: "L1212", Price: 1000})

// read
var p Product
db.First(&p, 1)
db.First(&p, "code = ?", "L1212")

// update
db.Model(&p).Update("Price", 2000)

// delete
db.Delete(&p)

Last updated

Was this helpful?