golang数据库操作之gorm

写个代码容易么 · · 6177 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

gorm快速上手 Quick start

数据库连接

1.Sqlite数据库

package main

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

func main() {
    //打开数据库连接
    var db, _ = gorm.Open("sqlite3", "demo.db")

    //关闭数据库连接
    defer db.Close()
}

2.MySQL数据库

数据库连接字符串格式即DSN (Data Source Name)格式为:

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

详情请参考https://github.com/go-sql-driver/mysql#dsn-data-source-name

package main

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

func main() {
    //打开数据库连接
    db, _ := gorm.Open("mysql", "demo:123456@(localhost)/demo?charset=utf8&parseTime=True&loc=Local")

    //关闭数据库连接
    defer db.Close()
}

操作示例

1.CURD基础操作

package main

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

type User struct {
    gorm.Model
    Name string
    Age  int
}

func main() {
    //打开数据库连接
    var db, _ = gorm.Open("sqlite3", "demo.db")

    //关闭数据库连接
    defer db.Close()

    //添加数据库表名前缀
    gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
        return "demo_" + defaultTableName
    }

    //创建表
    db.AutoMigrate(&User{})

    user := User{
        Name: "demo",
        Age:  20,
    }
    //插入数据
    db.Create(&user)

    //查询数据
    db.First(&user, "name = ?", "demo")
    println(fmt.Sprintf("%v", user))

    //更新数据
    user.Age = 21
    db.Save(&user)

    //查询数据
    db.First(&user, "name = ?", "demo")
    println(fmt.Sprintf("%v", user))

    //删除数据,软删除(存在deleted_at字段自动软删除,给deleted_at字段赋值就标记为删除)
    db.Delete(&user)

    //物理删除
    db.Unscoped().Delete(&user)

    var count = 0
    //查询总数
    db.Model(&User{}).Count(&count)

    println("user count: ", count)

    println("OK")
}

2.表关联

假设场景
有个学生Student,该Student有多本书Book

package main

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

type Book struct {
    gorm.Model
    StudentId int //关联Student表
    Name      string
    ISBN      string
    Price     float32
}

type Student struct {
    gorm.Model
    Name  string
    Age   int
    Books []Book
}

func main() {
    //打开数据库连接
    db, _ := gorm.Open("mysql", "demo:123456@(localhost)/demo?charset=utf8&parseTime=True&loc=Local")

    //关闭数据库连接
    defer db.Close()

    //创建表
    db.AutoMigrate(&Student{}, &Book{})

    book1 := Book{
        Name:  "Go语言实战",
        ISBN:  "9787115445353",
        Price: 59.00,
    }
    book2 := Book{
        Name:  "Go程序设计语言",
        ISBN:  "9787111558422",
        Price: 79.00,
    }
    student := Student{
        Name:  "demo",
        Age:   25,
        Books: []Book{book1, book2},
    }

    //插入数据,将写入一条student记录和两条与之关联的book记录
    db.Create(&student)

    //查询student关联的所有book信息
    var books []Book
    db.Model(&student).Related(&books)

    for _, book := range books {
        println(book.Name)
    }

    println("OK")
}

连接池配置

只有在面向连接的数据库才能设置连接池,比如MySQL或PostgreSQL
而基于文件的数据库,如Sqlite是不能设置连接池的

db.DB()返回*sql.DB通用接口,通过该接口可以配置底层数据库连接参数

// SetMaxIdleCons 设置连接池中的最大闲置连接数。
db.DB().SetMaxIdleConns(10)

// SetMaxOpenCons 设置数据库的最大连接数量。
db.DB().SetMaxOpenConns(100)

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:写个代码容易么

查看原文:golang数据库操作之gorm

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6177 次点击  ∙  3 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传