type User struct{
ID uint `gorm:"primary_key"`
Name string
Age int
Birthday time.Time
AddTime time.Time
}

连接数据库
db, err := gorm.Open("mysql", "用户名:密码@tcp(地址:端口号)/数据库名")
if err != nil {
panic("连接数据库失败")
}

创建表

db.SingularTable(true) //不设置,创建生成的表名都是默认是复数形式后面带s的,设置上这一句话,就不会默认带s了
//db.CreateTable(&User{}) //创建表

表内插入数据

//user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
//db.Create(&user) //插入数据

查询

查询出所有的数据,查询到的结果是个可循环的切片
type User struct{
ID uint `gorm:"primary_key"`
Name string
Age int
Birthday time.Time
}
var user []User
a :=db.Find(&user) #查询出所有的
打印出来查询的东西
for _, a:= range user {
fmt.Println(a)
fmt.Println(a.ID)
}

查询出所有符合条件的数据,查询到的结果是个可循环的切片

var user []User
//select * from user where name="Jinzhu1"
a :=db.Where("name = ?", "Jinzhu1").Find(&user) //Find是查询所有,First查询出一条
for _, a:= range user {
fmt.Println(a)
fmt.Println(a.ID)
}

db.Where("name = ?", "jinzhu").First(&users) //查询出一条符合的数据
db.Where("name <> ?", "jinzhu").Find(&user) //查出name不等于jinzhu的数据
db.Where("name in (?)", []string{"jinzhu", "jinzhu1"}).Find(&user) //查询出name in ("jinzhu", "jinzhu1") 所有数据
db.Where("name LIKE ?", "%jin%").Find(&user) //模糊查询 select * from user where name LIKE "%jin%"
db.Where("name = ? AND age >= ?", "jinzhu", "17").Find(&user) //select * FROM user Where name ="jinzhu" AND age>17
db.Where(&User{Name: "jinzhu", Age: 20}).First(&user) //SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;
db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users) //SELECT * FROM users WHERE name = "jinzhu" AND age = 20;
db.Where([]int64{1, 2, 3}).Find(&user) //SELECT * FROM users WHERE id IN (20, 21, 22);
用结构体查询的时候,GORM只会与非零条件查询,查询条件中的 0 ,"",false获取他零值,它不会被用来构成查询条件,例如
db.Where(&User{Name: "jinzhu", Age: 0}).Find(&users) // SELECT * FROM users WHERE name = "jinzhu";

查询出来的数据是单条的话
user :=User{}
db.Find(&user) // 查询
fmt.Println(user.ID) //获取使用查询出来的某个字段

更新
单条更新的(包括自动更新的如当前时间的字段)
user :=User{}
db.First(&user) //查询出一条数据
user.Name="334" //给数据赋新值
db.Save(&user) //更新 UPDATE users SET name='334' WHERE id=1;但是如果表中有自动更新的字段,如时间更新当前的时间,那么用Save也会把这些一块更新的

单条更新更新改变字段
user := User{}
db.Model(&user).Update("name","啊") //更新所有的数据 name="啊"

更新符合条件的数据
db.Model(&user).Where("id = ?", 1).Update("name", "hello")
更新所有数据的多个字段
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18})
更新所有数据的多个字段
db.Model(&user).Updates(User{Name: "hello", Age: 18})
下面这个不会被更新,只会更新非空白的值,即非 0,false ,""等
db.Model(&user).Updates(User{Name: "", Age: 0})
更新字段忽略选定的字段,下面忽略了name omit中的
db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "321", "age": 118})
更新选定的字段,只更新name字段即Select里面的字段
db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18})

批量更新符合条件的数据
db.Table("user").Where("id IN (?)", []int{1, 2}).Updates(map[string]interface{}{"name": "aa", "age": 9})
db.Model(User{}).Where("id IN (?)",[]int{1,2}).Updates(User{Name: "cc", Age: 13})

删除
user := User{}
db.Delete(&user) //删除表里的所有数据了
带条件的删除
db.Where("name LIKE ?", "%jinzhu%").Delete(User{})

go语言数据库操作, gorm框架的更多相关文章

  1. go语言数据库操作,xorm框架

    待续............................................... 连接数据库 db, err := xorm.NewEngine("mysql", ...

  2. 分享一个以前写的基于C#语言操作数据库的小框架

    一:前言 这个是以前写的操作MySQL数据库的小型框架,如果是中小型项目用起来也是很不错的,里面提供Filter.ModelPart.Relationship等机制实现操作数据库时的SQL语句的拼接和 ...

  3. 基于Gin+Gorm框架搭建MVC模式的Go语言后端系统

    文/朱季谦 环境准备:安装Gin与Gorm 本文搭建准备环境:Gin+Gorm+MySql. Gin是Go语言的一套WEB框架,在学习一种陌生语言的陌生框架,最好的方式,就是用我们熟悉的思维去学.作为 ...

  4. java之Hibernate框架实现数据库操作

    之前我们用一个java类连接MySQL数据库实现了数据库的增删改查操作---------MySQL篇: 但是数据库种类之多,除了MySQL,还有Access.Oracle.DB2等等,而且每种数据库语 ...

  5. IT观察】网络通信、图片显示、数据库操作……Android程序员如何利用开源框架

    每个Android 程序员都不是Android应用开发之路上孤军奋战的一个人,GitHub上浩如烟海的开源框架或类库就是前人为我们发明的轮子,有的轮子能提高软件性能,而有的轮子似乎是以牺牲性能为代价换 ...

  6. Litepal 数据库操作框架的使用 (火)

    LitePal是GitHub上一款开源的Android数据库框架. 它採用了对象关系映射(ORM)的模式,将平时开发时最经常使用的一些数据库功能进行了封装.使得开发人员不用编写一行SQL语句就能够完毕 ...

  7. greenDao:操作数据库的开源框架

    greenDAO: Android ORM for your SQLite database 1. greenDao库获取 英文标题借鉴的是greendrobot官网介绍greenDao时给出的Tit ...

  8. Entity Framework 实体框架的形成之旅--几种数据库操作的代码介绍(9)

    本篇主要对常规数据操作的处理和实体框架的处理代码进行对比,以便更容易学习理解实体框架里面,对各种数据库处理技巧,本篇介绍几种数据库操作的代码,包括写入中间表操作.联合中间表获取对象集合.递归操作.设置 ...

  9. 十三、EnterpriseFrameWork框架核心类库之数据库操作(多数据库事务处理)

    本章介绍框架中封装的数据库操作的一些功能,在实现的过程中费了不少心思,针对不同数据库的操作(SQLServer.Oracle.DB2)这方面还是比较简单的,用工厂模式就能很好解决,反而是在多数据库同时 ...

随机推荐

  1. react-native不是内部或 外部命令,也不是可运行的程序或批处理文件

    1.执行node命令时提示:node不是内部或外部命令,也不是可运行的程序或批处理文件. 原因环境变量没有指向node安装目录 path:C:\Program Files\nodejs\ 2.reac ...

  2. ie浏览器部分图片不显示

    前言 前几天做项目时,发现一个奇怪的现象,从后台获取的图片,在IE浏览器端,有一部分不会显示,仔细研究发现是图片本来是.jpg格式,后台传过来的图片后缀已经被改成了.png格式或者其它格式导致IE浏览 ...

  3. slim.arg_scope中python技巧

    slim.arg_scope函数说明如下: Stores the default arguments for the given set of list_ops. For usage, please ...

  4. python3元组

    Python3 元组 元组运算符 len((1, 2, 3)) 3 计算元素个数 (1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) 连接 ('Hi!',) * 4 (' ...

  5. 2018-2019-2 20165325《网络对抗技术》Exp0 Kali安装 Week1

    2018-2019-2 20165325<网络对抗技术>Exp0 Kali安装 Week1 一.安装kali VMware上学期已经有了,主要是下载Kali-Linux-2019.1-vm ...

  6. 3D Slicer中文教程(八)—导出STL文件

    一.STL文件简介 STL(立体平版印刷术的缩写)是由3D Systems创建的立体平版印刷CAD软件原生的文件格式STL有“标准三角语言”和“标准镶嵌语言”等几个事后回溯.这种文件格式是由许多其他软 ...

  7. 如何用java实现一个p2p种子搜索(2)-路由表实现

    路由表实现 回顾一下上一篇讲的内容,上一篇提到从dht网络中获取infohash,那么加入dht网络后的最重要的第一步就是怎么去建立路由表. 路由表里面保存的是dht中其他node的信息,所以node ...

  8. 收藏vue技术内幕

    http://hcysun.me/vue-design/art/7vue-reactive.html#observer-%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0

  9. 实验一《Java开发环境的熟悉》_实验报告

    实验一<Java开发环境的熟悉>_实验报告 一.实验内容与主要步骤 1.Linux系统命令行下java程序开发 实验要求 1 建立"自己学号exp1"的目录 2 在&q ...

  10. C# 高级编程02----手动创建C#程序

    在日常工作中使用C# 开发的时候,通常使用宇宙第一神器VS进行开发.为了了解编译过程,这里采用文本编辑器的方式编写一个C#程序 一.创建一个C#程序 1.使用记事本工具创建一个名为First.cs的文 ...