区块链Two——数据库(1)

依旧是疯狂往脑子里灌输知识的一天,这些文章都是笔记。会在网站上搜索有关知识让后进行笔记摘要,主要以看某知名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") //删除索引

你可能感兴趣的:(区块链Two——数据库(1))