依旧是疯狂往脑子里灌输知识的一天,这些文章都是笔记。会在网站上搜索有关知识让后进行笔记摘要,主要以看某知名up主(说我营销没办法发出来了)为主,结合自己个人情况进行的笔记归纳总结。
下面关于gorm来自于GORM文档的笔记和总结,gorm一共四篇
为什么要使用数据库?
因为不使用数据库只是简单地将区块链存储在内存中,一旦退出所有的内容都消失。我们就没办法使用这条链也没办法与他人分享。
要使用哪种数据库呢?
任何数据库都可以,这里我用的mysql并且会使用gorm,实习需要其他的可能我也不知道太多。就只做这部分数据库的笔记,想看BoltDB的可以去↑up主那里看。
那我们如何去做呢?(先整体的代码,之后分开来说)
快速开始
package main
import("
github.com/jinzhu/gorm"
_"github.com/jinzhu/gorm/dialects/sqlite"
)
typeProductstruct{
gorm.Model
Code string
Price uint
}
func main(){
db, err := gorm.Open("sqlite3","test.db")
if err !=nil{
panic("连接数据库失败")
}
deferdb.Close()
db.AutoMigrate(&Product{}) //自动迁移模式
db.Create(&Product{Code:"L1212", Price:1000}) //创建
var product Product //读取
db.First(&product,1) //查询id为1的product
productdb.First(&product,"code = ?","L1212")// 查询code为l1212的product
db.Model(&product).Update("Price",2000) //更新product的price为2000
productdb.Delete(&product) //删除product
}
1.连接数据库(导入驱动程序)
import(
"github.com/jinzhu/gorm"
_"github.com/jinzhu/gorm/dialects/mysql"
)
funcmain(){
db, err := gorm.Open("mysql","user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
deferdb.Close()
}
2.迁移
(1)自动迁移(该模式保持更新到最新)
注意:自动迁移只会创建表,缺少列和索引,并且不会改变现有列的类型或删除未使用的列。
db.AutoMigrate(&User{})
db.AutoMigrate(&User{}, &Product{}, &Order{})
db.Set("gorm:table_options","ENGINE=InnoDB").AutoMigrate(&User{}) // 创建表时添加表后缀
(2)检查表是否存在
db.HasTable(&User{}) //检查模型`User`表是否存在
db.HasTable("users") //检查表`users`是否存在
(3)创建表
db.CreateTable(&User{}) // 为模型`User`创建表
db.Set("gorm:table_options","ENGINE=InnoDB").CreateTable(&User{}) // 创建表`users'时将“ENGINE = InnoDB”附加到SQL语句
/*
ENGINE = InnoDB的意思为:存储引擎是innodb;
innobd是一套放在mysql后台的完整数据库系统
*/
(4)删除表
db.DropTable(&User{}) //删除模型`User`的表
db.DropTable("users") //删除表`users`
db.DropTableIfExists(&User{},"users") //删除模型`User`的表和表`users`
(5)修改列
db.Model(&User{}).ModifyColumn("description","text") //修改模型`User`的description列的数据类型为`text`
(6)删除列
db.Model(&User{}).DropColumn("description") //删除模型`User`的description列
(7)添加外键
db.Model(&User{}).AddForeignKey("city_id","cities(id)","RESTRICT","RESTRICT") //第一个值:外键字段;第二个值:外键表(字段);第三个值:on_delete;第四个值:on_update
/*
on_delete(on_update与它相似为修改):它是指通过ForeignKey连接起来的对象被删除后,当前字段怎么变化。常使用的选项:
No Action:父表(外键来源表)中删除对用记录时,先检查是否有对应外键,如果有则不许删除
Restrict:同上
Cascade:父表(外键来源表)中删除对应记录时,先检查是否有对应外键,如果有则删除外键在子表中的记录
Set Null:父表(外键来源表)中删除对应记录时,先检查是否有对应外键,如果有则设置子表中外键为null(前提是该外键允许为null)
*/
(8)索引
db.Model(&User{}).AddIndex("idx_user_name","name") //为`name`列添加索引`idx_user_name`
db.Model(&User{}).AddIndex("idx_user_name_age","name","age") //为`name`, `age`列添加索引`idx_user_name_age`
db.Model(&User{}).AddUniqueIndex("idx_user_name","name") //添加唯一索引
db.Model(&User{}).AddUniqueIndex("idx_user_name_age","name","age") //为多列添加唯一索引
db.Model(&User{}).RemoveIndex("idx_user_name") //删除索引