goland连接数据库

参考连接: https://www.tizi365.com/archives/20.html

连接数据库
import "github.com/jinzhu/gorm"

func initdb() {
	// 第一个参数:数据库类型(mysql,postgres)
	// 第二个参数:数据库连接,用户名:密码@protocal(ip:port)
	conn := "root:root@tcp(192.168.1.12:3306)?charset=Utf8&parseTime=true&loc=Local"
	db,err := gorm.Open("mysql", conn)
	defer db.Close()
	
	//SetMaxOpenConns用于设置最大打开的连接数
    //SetMaxIdleConns用于设置闲置的连接数
    db.DB().SetMaxIdleConns(10)
    db.DB().SetMaxOpenConns(100)

}
定义模型
type User struct{
	Name   string   `gorm:"column:name"`
	Age    int      `gorm:"default:18"`
	Hobby  []string `gorm:"column:interests"`
}
//注意最后hobby在数据库里的column是interests

func (User) TableName() string {
	return "users"
}
插入数据(传入的是地址)
user := User{
	Name : "amber",
	Age  :  23,
	Hobby : nil,
}
err := db.Create(&user).Error

注意:这里如果要创建多个,必须每次重新初始化user对象

更新数据

第一种方式:根据筛选条件更新某几项参数

	name := "necy"
	age := 25
	err := db.Model(&User).Where("name = ?", name).Update("age", age).Error

第二种方式:不管有没有更新项直接update

user := User{
		Name : "amber",
		Age  :  23,
		Hobby : nil,
	}
	// &user 传入的具体参数,如果里面包含主键,便只更新匹配主键的对象
	err := db.Update(&user).Error
	
	// &user{}更新所有user对象
	err := db.Update(&user{}).Error

第三种方式:save保存及更新

user := User{
		Name : "amber",
		Age  :  23,
		Hobby : nil,
	}
	// 此时会先在数据库种查找一遍,若user对象不存在会创建,若user对象已存在则更新user对象
	err := db.Save(&user).Error

save时报错: Error 1062: Duplicate entry ‘c2ba36f4161d4ccea2717b832552c57c’ for key ‘uniq_uuid’

原因分析:代码里定义数据库模型时没有id,但在数据库种id作为自增键,代码里不写在执行其他方法时不会报错,但在save里会报错

删除数据
user := User{}
err := db.Where("name = ?", name).Delete(&user).Error
查询单个数据
user := User{}
err := db.Where("name = ?", name).First(&user) //查询一个
查询多个数据
user := []User{}
err := db.Where("name = ?", name).Find(&user) //只能用长度判断数据是否存在
查询个数
var count int
err := db.Where("name = ?", name).Find(&user).Count(&count)
err := db.Table("users").Where("name = ?", name).Count(&count)
开启debug模式:
err := db.DEBUG().Where("name = ?", name).Find(&user).Count(&count)

注意:如果查询plunk这种非整条数据返回,log里显示 0rows return

获取年龄最大值
方式一
func getMaxAge() {
	max := 0
	name = "amber"
    rows, err := db.Table("users").Select(" MAX(age) AS max ").Where(" name = ? ", name ).Rows()
    if err != nil {
        common.Log.Error("查询最大值年龄报错 %v", err)
    }
    if rows.Next() {
        err := rows.Scan(&max)
        if err != nil {
            common.Log.Error("报错 %v", err)
        }
    }
     defer rows.Close()
}
方式二
//注意这里查询出的列名要与gorm:"column里指定的一致,否则查出的数据全部是0

func getMaxAge() {
	Age:= &struct {
	    SumAge int `gorm:"column:sum_age"`
	}{}
	    
	if err := DB.Raw("select sum(age) as sum_age from users where uuid = ?", id).Scan(ingress).Error; err != nil {
	     common.Log.Error("报错 %v", err)
	}   
}
获取成绩最高且年龄大于20的同学名字
// 初始化name要带引用
name := &[]string{}

err := db.DB.Debug().Table("users").Where("age>= ? AND score= (select max(score) from users)", 20).Pluck("name", name).Error
if err != nil {
	fmt.Println(name)
}
查询大于指定ip的数据
select ip from devices where INET_ATON(ip) >= '192.168.1.0'

db.Where("INET_ATON(ip) >= INET_ATON(?)", "192.168.1.0")
更新指定范围内数据
var uuids []string
DB.Model(&User{}).Where("uuid IN (?)", uuids).UpdateColumn("age", 18).Error
获取指定偏移量数据
// 每次取出指定数量数据,偏移量和指定数量要一致
var limit int
var offset int
DB.Debug().Limit(limit).Offset(offset).Find(&User{}).Error
排序
// 查询年龄大于18的学生,并降序排列
db.Where("age>= ?", 18).Order("age desc").Find(&user)
统计group by 后指定列个数
// 定义一个结构体存放取出的数据
type Result struct {
    Age   int
    Total int
}

var results []Result
//等价于: SELECT age, count(*) as  total FROM `user` GROUP BY age HAVING (total > 0)

db.Model(&User{}).Select("age, count(*) as  total").Group("age").Having("total > 5").Scan(&results)

// 统计相同年龄的孩子个数,注意select获取的列和group by的列要一致
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Go 语言中,我们可以使用 `database/sql` 包来访问 SQLite 数据库。下面是一个简单的示例: ```go package main import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" ) func main() { // 打开 SQLite 数据库 db, err := sql.Open("sqlite3", "./test.db") if err != nil { panic(err) } defer db.Close() // 创建表 _, err = db.Exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)") if err != nil { panic(err) } // 插入数据 stmt, err := db.Prepare("INSERT INTO users(name) values(?)") if err != nil { panic(err) } defer stmt.Close() _, err = stmt.Exec("Alice") if err != nil { panic(err) } // 查询数据 rows, err := db.Query("SELECT * FROM users") if err != nil { panic(err) } defer rows.Close() for rows.Next() { var id int var name string err := rows.Scan(&id, &name) if err != nil { panic(err) } fmt.Printf("id=%d, name=%s\n", id, name) } } ``` 在上面的示例中,我们使用了 `github.com/mattn/go-sqlite3` 包来访问 SQLite 数据库。在打开数据库时,我们传递了数据库文件路径 `./test.db`。然后,我们创建了一个名为 `users` 的表,并向其中插入了一条数据。最后,我们查询了表中的所有数据,并将其打印出来。 需要注意的是,SQLite 是一个嵌入式数据库,因此它的使用方式与其他数据库有所不同。在使用 SQLite 时,我们不需要启动一个独立的数据库服务器,而是直接访问一个文件。这种方式的好处是非常方便,但也存在一些缺点,比如并发性能不如其他数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值