gin Gorm query
// Query the first record according to the primary key
db. First(&user)
SELECT * FROM users ORDER BY id LIMIT 1;
// Get a random record
db. Take(&user)
SELECT * FROM users LIMIT 1;
// Query the last record according to the primary key
db. Last(&user)
SELECT * FROM users ORDER BY id DESC LIMIT 1;
// query all records
db. Find(&users)
SELECT * FROM users;
// Query a specified record (only available when the primary key is an integer)
db. First(&user, 10)
SELECT * FROM users WHERE id = 10;
// Get first matched record
db.Where("name = ?", "jinzhu").First(&user)
// SELECT * FROM users WHERE name = 'jinzhu' limit 1;
// Get all matched records
db.Where("name = ?", "jinzhu").Find(&users)
// SELECT * FROM users WHERE name = 'jinzhu';
// <>
db.Where("name <> ?", "jinzhu").Find(&users)
//SELECT * FROM users WHERE name <> 'jinzhu';
// IN
db.Where("name IN (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)
// SELECT * FROM users WHERE name in ('jinzhu','jinzhu 2');
// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)
// SELECT * FROM users WHERE name LIKE '%jin%';
// AND
db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
// SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;
// Time
db.Where("updated_at > ?", lastWeek).Find(&users)
// SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';
// BETWEEN
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
// SELECT * FROM users WHERE created_at BETWEEN '2000-01-01 00:00:00' AND '2000-01-08 00:00:00';
//Query where records
var users [] User
db.Where("name = ?", "zisefeizhu ").Find(&users)
fmt.Printf("user:%#v\n",users)
Struch & Map query
//Struct
db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)
// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;
//Map
db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users)
// SELECT * FROM users WHERE name = "jinzhu" AND age = 20;
// slice of primary key
db.Where([]int64{20, 21, 22}).Find(&users)
//SELECT * FROM users WHERE id IN (20, 21, 22);
Note: When querying through structs, GORM will only query through non-zero value fields, which means that if your field value is 0, '', false or other zero value, it will not be used to build the query condition.
db.Where(&User{Name: "jinzhu", Age: 0}).Find(&users)
// SELECT * FROM users WHERE name = "jinzhu";
db.Not("name", "jinzhu").First(&user)
SELECT * FROM users WHERE name <> "jinzhu" LIMIT 1;
// Not In
db.Not("name", []string{"jinzhu", "jinzhu 2"}).Find(&users)
SELECT * FROM users WHERE name NOT IN ("jinzhu", "jinzhu 2");
// Not In slice of primary keys
db.Not([]int64{1,2,3}).First(&user)
SELECT * FROM users WHERE id NOT IN (1,2,3);
db.Not([]int64{}).First(&user)
SELECT * FROM users;
// Plain SQL
db.Not("name = ?", "jinzhu").First(&user)
SELECT * FROM users WHERE NOT(name = "jinzhu");
// Struct
db.Not(User{Name: "jinzhu"}).First(&user)
SELECT * FROM users WHERE name <> "jinzhu";
db.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&users)
SELECT * FROM users WHERE role = 'admin' OR role = 'super_admin';
// Struct
db.Where("name = 'jinzhu'").Or(User{Name: "jinzhu 2"}).Find(&users)
SELECT * FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2';
// Map
db.Where("name = 'jinzhu'").Or(map[string]interface{}{"name": "jinzhu 2"}).Find(&users)
// Get records based on primary key (only applicable to integer primary key)
db. First(&user, 23)
SELECT * FROM users WHERE id = 23 LIMIT 1;
// Get records based on the primary key, if it is a non-integer primary key
db. First(&user, "id = ?", "string_primary_key")
SELECT * FROM users WHERE id = 'string_primary_key' LIMIT 1;
// Plain SQL
db. Find(&user, "name = ?", "jinzhu")
SELECT * FROM users WHERE name = "jinzhu";
db.Find(&users, "name <> ? AND age > ?", "jinzhu", 20)
SELECT * FROM users WHERE name <> "jinzhu" AND age > 20;
//Struct
db. Find(&users, User{Age: 20})
SELECT * FROM users WHERE age = 20;
//Map
db.Find(&users, map[string]interface{}{"age": 20})
SELECT * FROM users WHERE age = 20;
package main
import (
"database/sql"
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
//1. Define the model
type User struct {
ID int64
//Name *string `gorm:"default:'zisefeizhu'"`
Name sql.NullString `gorm:"default:'zisefeizhu'"`
Age byte
}
func main() {
//2. Connect to Mysql database
db, err := gorm.Open("mysql","root:123456@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
defer db. Close()
//3. Match the model with the table in the database
db. AutoMigrate(&User{})
//4. Create a structure instance
//u := User{Name: sql.NullString{"", false}, Age: 60}
//fmt.Println(db.NewRecord(&u)) // returns `true` if the primary key is empty
//db.Debug().Create(&u) // Create a user record in the database
//fmt.Println(db.NewRecord(u)) // returns `false` after creating `user`
//Inquire
//var user User //declare model structure variable type user (folder A)
//db.First(&user) //(folder B)
//user:main.User{ID:1, Name:sql.NullString{String:"zisefeizhu", Valid:true}, Age:0x1e}
user := new(User)
db. First(user)
fmt.Printf("user:%#v\n",user)
//user:&main.User{ID:1, Name:sql.NullString{String:"zisefeizhu", Valid:true}, Age:0x1e}
//Query all records
var users [] User
//users := make([]User, 10)
db. Find(&users)
fmt.Printf("user:%#v\n",users)
}
Group & Having
rows, err := db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Rows()
for rows.Next() {
...
}
// Use Scan to scan multiple results into the prepared structure slice
type Result struct {
Date time.Time
Total int
}
var rets []Result
db.Table("users").Select("date(created_at) as date, sum(age) as total").Group("date(created_at)").Scan(&rets)
rows, err := db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Having("sum(amount) > ?", 100).Rows()
for rows.Next() {
...
}
type Result struct {
Date time.Time
Total int64
}
db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Having("sum(amount) > ?", 100).Scan(&results)