前提
go get github.com/jinzhu/gorm
增删改查实例代码
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"log"
"time"
)
var db *gorm.DB
type User struct {
User_id int `gorm:"primary_key"` //指定主键并自增
Name string
Pwd string
CreatedAt time.Time
UpdatedAt time.Time
Car []Car `gorm:"ForeignKey:User_id;AssociationForeignKey:User_id"` //(一对多)指定外键和关联外键
}
type Car struct {
Car_id int32 `gorm:"primary_key"`
User_id int
Car_name string
Car_gongli string
Proce int
}
func allError(err error){
if err!=nil{
log.Println(err.Error())
}
}
func Create_table(){
//一个坑,不设置这个参数,gorm会把表名转义后加个s,导致找不到数据库的表
db.SingularTable(true)
//自动迁移模式 有表不创 无表创表 少列加列 有列不加
db.AutoMigrate(&User{},&Car{})
}
func Select(){
user := User{}
//日志调试模式
db.LogMode(true)
//
db.SingularTable(true)
//db.First(&user, 1)
//关联查询 一对多
db.Where("Name = ?","owen").Preload("Car").Find(&user)
//执行了 SELECT * FROM `user` WHERE (Name = 'owen') SELECT * FROM `car` WHERE (`user_id` IN (1))
fmt.Println(user)
db.Where("user_id = ?", 1).Preload("Car").Find(&user)
//执行了 SELECT * FROM `user` WHERE (user_id = 1) SELECT * FROM `car` WHERE (`user_id` IN (1))
fmt.Println(user)
//关联查询多对一
db.Where("user_id = ?", 1).Preload("Car","car_name like ?","%本%").Find(&user)
//执行了 SELECT * FROM `user` WHERE (user_id = 1) SELECT * FROM `car` WHERE (`user_id` IN (1)) AND (car_name like '%本%')
fmt.Println(user)
}
func Updata(){
user:=User{}
//日志调试模式
//db.LogMode(true)
db.SingularTable(true)
//选择字段更新的两种模式
err:=db.Model(&user).Where("Name = ?","hello").Updates(User{Name: "owen", Pwd: "1323"}).Error
allError(err)
err=db.Model(&user).Where("name = ?","owen").UpdateColumns(User{Name: "hello", Pwd: "1323"}).Error
allError(err)
}
func Delete(){
user:=User{}
db.SingularTable(true)
//删除指定的
err:=db.Delete(user,"name = ? and pwd = ?","owen","1323").Error
allError(err)
}
func Insert() {
db.SingularTable(true)
user := User{Name: "Jinzhu", Pwd: "123421"}
err := db.Create(&user).Error
allError(err)
}
func init() {
var err error
db, err = gorm.Open("mysql", "user:pw@tcp(localhost:3306)/dbname?charset=utf8&parseTime=True&loc=Local")
//defer db.Close()
allError(err)
}
func main() {
Create_table()
Insert()
Select()
Updata()
Delete()
}
2.1gorm 关联查询
//数据库的表结构
type User struct {
User_id int `gorm:"primary_key;comment:'id'""` //指定主键并自增
Name string`gorm:"varchar(30);comment:'姓名'"`
Pwd string`gorm:"varchar(30);comment:'密码'"`
CreatedAt time.Time `gorm:"comment:'创建时间'"`
UpdatedAt time.Time `gorm:"comment:'更新时间'"`
}
type Class struct {
Id int
Class string `gorm:"varchar(255)"`
}
type Result struct {
User_id string `json:"Id"`
Class string `json:"class"`
Name string `json:"Name"`
Pwd string `json:"pwd"`
}
//关联查询数据
func Select() []Result{
db.SingularTable(true)
db.LogMode(true)
var result []Result
db.Table("user").Select("user_id,name,pwd,class").Joins("left join class on class.id=user.user_id").Scan(&result)
return result
}
3、后言
-
支持的数据库
mysql 注意: 为了正确的处理time.Time
,你需要包含parseTime
作为参数。 (More supported parameters)import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) func main() { db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local") defer db.Close() }
pgsql:
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
)
func main() {
db, err := gorm.Open("postgres", "host=myhost port=myport user=gorm dbname=gorm password=mypassword")
defer db.Close()
}
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()
}
sqlserver:
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mssql"
)
func main() {
db, err := gorm.Open("mssql", "sqlserver://username:password@localhost:1433?database=dbname")
defer db.Close()
}