DDL操作
对数据库,表,字段等的操作,这里指的DDl不包括数据库
一、数据库
- 连接数据库
// 引入gorm及驱动包
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
db,db_err := gorm.Open("mysql","root:Qazwsx123@[tcp](localhost:3306)/test_gorm?charset=utf8&parseTime=True&loc=Local")
if err!= nil{
panic(err)
}
defer db.Close() // 关闭连接
// loc=Local:表示根据本地时区走
// parseTime:处理time.Time
二、表
1.创建表
type User struct {
Id int
Name string
Age int
}
// 创建表
db.Table("user").CreateTable(&User{}) // 指定表名
db.CreateTable(&User{}) // 不指定表名,模型后面会加个s
2.删除表
db.DropTable(&User{}) // 使用模型名
db.DropTable("users") // 直接使用表名
db.DropTableIfExists(&User{}) // 先判断是否存在再删除,可以接受多个参数,模型和字符串都可以
3.检查表是否存在
is_has := db.HasTable(&User{}) // 使用模型
is_has := db.HasTable("users") // 使用表名
fmt.Println(is_has)
三、列(不建议进行操作,直接在模型上指定迁移即可)
1.修改列
// 修改模型User
的description列的数据类型为text
db.Model(&User{}).ModifyColumn(“description”, “text”)
2.删除列
// 删除模型User
的description列
db.Model(&User{}).DropColumn(“description”)
3.添加外键
db.Model(&User{}).AddForeignKey("city_id", "cities(id)", "RESTRICT", "RESTRICT")
// 第一个参数: 外键字段
// 第二个参数 : 外键表(字段)
// 第三个参数 : ONDELETE
// 第四个参数 : ONUPDATE
4.索引
// 为name
, age
列添加索引idx_user_name_age
db.Model(&User{}).AddIndex(“idx_user_name_age”, “name”, “age”)
// 为多列添加唯一索引
db.Model(&User{}).AddUniqueIndex(“idx_user_name_age”, “name”, “age”)
四、数据库迁移
1.自动迁移
自动迁移仅仅会创建表,添加缺少列和索引,并且不会改变现有列的类型或删除未使用的列以保护数据
db.AutoMigrate(&User{})
db.AutoMigrate(&User{}, &Product{}, &Order{})
// 创建表时添加表后缀
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})