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. .net 解压缩 rar文件

    public static class RARHelper { public static bool ExistsWinRar() { bool result = false; string key ...

  2. 移动端1px问题处理方法

    在做移动端开发时,设计师提供的视觉稿一般是750px,当你定义 border-width:1px 时,在iphone6手机上却发现:边框变粗了.. 这是因为,1px是相对于750px的(物理像素),而 ...

  3. L1-Day8

    1.他就是我昨天见的那个人. [我的翻译]He is a man who I saw him yestorday. [标准答案]He is the man (who(m) /that) I saw y ...

  4. 产品研发不等待 i.MX6Q全新推出增强版本 官方店铺下单双重优惠

    迅为全新推出PLUS版本的i.MX6Q方案,版本介绍:它是NXP公司全新推出的i.MX6Q增强版新品,显著增强了图形和存储器性能,面向较高图形性能的先进消费电子.汽车和工业多媒体应用的多核平台.

  5. 基于范围的for循环(C++11)

    C++11新增了一种循环:基于范围的for循环.这简化了一种常见的循环任务:对数组(或容器类,如vector和array)的每个元素执行相同的操作,如下例所示 for语句允许简单的范围迭代:(只遍历, ...

  6. 第十四节,OpenCV学习(三)图像的阈值分割

    图像的阈值处理 图像的阈值分割:图像的二值化(Binarization) 阈值分割法的特点是:适用于目标与背景灰度有较强对比的情况,重要的是背景或物体的灰度比较单一,而且总可以得到封闭且连通区域的边界 ...

  7. shell的进度条【转】

    生成进度条的俩个shell脚本 !/bin/bash i= bar='' index= arr=( "|" "/" "-" "\\ ...

  8. MongoDB数据库(一):基本操作

    1.NoSQL的概念 "NoSQL"一词最早于1998年被用于一个轻量级的关系数据库的名字 随着web2.0的快速发展,NoSQL概念在2009年被提了出来 NoSQL最常见的解释 ...

  9. ubuntu快速部署gitlab汉化容器

    前言:gitlab的原理我就不扯了(看这个https://www.jianshu.com/p/567207ac51cd),下面直接上操作 1.前提: a.要有docker的运行环境,用service ...

  10. 2018-2019-2 网络对抗技术 20165206 Exp4 恶意代码分析

    - 2018-2019-2 网络对抗技术 20165206 Exp4 恶意代码分析 - 实验任务 1系统运行监控(2分) (1)使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP ...