GORM 官网反对的数据库类型有: MySQL,PostgreSQL,SQlite,SQL Server
MYSQL
import ( "gorm.io/driver/mysql" "gorm.io/gorm") func main() { // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情 dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})}
PostgreSQL
import ( "gorm.io/driver/postgres" "gorm.io/gorm") dsn := "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})#### SQLiteimport ( "gorm.io/driver/sqlite" // Sqlite driver based on GGO // "github.com/glebarez/sqlite" // Pure go SQLite driver, checkout https://github.com/glebarez/sqlite for details "gorm.io/gorm") // github.com/mattn/go-sqlite3db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
SQL Server
import ( "gorm.io/driver/sqlserver" "gorm.io/gorm") // github.com/denisenkom/go-mssqldbdsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})
连接池
GORM 应用database/sql保护连接池sqlDB, err := db.DB()// SetMaxIdleConns 设置闲暇连接池中连贯的最大数量sqlDB.SetMaxIdleConns(10)// SetMaxOpenConns 设置关上数据库连贯的最大数量。sqlDB.SetMaxOpenConns(100)// SetConnMaxLifetime 设置了连贯可复用的最大工夫。sqlDB.SetConnMaxLifetime(time.Hour)
Create
package mainimport ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "time")type Userinfo struct { Id uint Name string Gender string Hobby string}type UserTest struct { ID uint Name string Email *string Age uint8 Birthday *time.Time MemberNumber sql.NullString ActivatedAt sql.NullTime CreatedAt time.Time UpdatedAt time.Time}func main() { // 连贯数据库 dsn := "root:xixxxxxu@tcp(10.xx.18x.1x:3306)/test?charset=utf8mb4&parseTime=True&loc=Local" db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{}) ////主动迁徙 //db.AutoMigrate(&Userinfo{}) //u1 := Userinfo{Id: 1, Name: "张三", Gender: "男", Hobby: "学习"} //db.Create(&u1) //创立 //create table and inster db.AutoMigrate(&UserTest{}) britime := time.Now() user := UserTest{Name: "Sean", Age: 17, Birthday: &britime} result := db.Create(&user) //user.ID // 返回插入数据的主键 //result.Error // 返回 error //result.RowsAffected // 返回插入记录的条数 fmt.Println(user.ID, result.Error, result.RowsAffected)}
Query
// 获取第一条记录(主键升序)db.First(&user)// SELECT * FROM users ORDER BY id LIMIT 1;// 获取一条记录,没有指定排序字段db.Take(&user)// SELECT * FROM users LIMIT 1;// 获取最初一条记录(主键降序)db.Last(&user)// SELECT * FROM users ORDER BY id DESC LIMIT 1;result := db.First(&user)result.RowsAffected // 返回找到的记录数result.Error // returns error or nil// 查看 ErrRecordNotFound 谬误errors.Is(result.Error, gorm.ErrRecordNotFound)
func main() { // 连贯数据库 dsn := "root:xixxxxxu@tcp(1xxxxxxx:3306)/test?charset=utf8mb4&parseTime=True&loc=Local" db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{}) ////主动迁徙 //db.AutoMigrate(&Userinfo{}) //u1 := Userinfo{Id: 1, Name: "张三", Gender: "男", Hobby: "学习"} //db.Create(&u1) //创立 ////create table and inster //db.AutoMigrate(&UserTest{}) // //britime := time.Now() //user := UserTest{Name: "Sean", Age: 17, Birthday: &britime} //result := db.Create(&user) ////user.ID // 返回插入数据的主键 ////result.Error // 返回 error ////result.RowsAffected // 返回插入记录的条数 //fmt.Println(user.ID, result.Error, result.RowsAffected) //Query var user_test UserTest //var users []UserTest result := db.First(&user_test, "id = ?", 1) // SELECT * FROM users WHERE id = 1 db.Model(UserTest{}).First(&user_test) fmt.Println(result.RowsAffected, user_test)}
redis
package mainimport ( "fmt" "github.com/go-redis/redis")func ConnRedis() { rd := redis.NewClient(&redis.Options{ Addr: "10.2x.1xx.1xx:6379", // url Password: "XixxxxU", DB:0, // 0号数据库 }) result, err := rd.Ping().Result() if err != nil { fmt.Println("ping err :",err) return } fmt.Println(result)}var rd *redis.Client= redis.NewClient(&redis.Options{ Addr: "10.23.x8.xx:6379", // url Password: "XxxxxU", DB:7, // 数据库})// string操作func SetAndGet() { // set操作:第三个参数是过期工夫,如果是0示意不会过期。 defer rd.Close() // 记得敞开连贯 err := rd.Set("prüfung", "hallo kugou",0).Err() if err != nil { fmt.Println("set err :",err) return } // get操作 val,err := rd.Get("prüfung").Result() if err != nil { fmt.Println("get err :",err) return } fmt.Println("k1 ==",val)}// 申明一个全局的rdb变量var rdb *redis.Client// 初始化连贯func initClient() (err error) { rdb = redis.NewClient(&redis.Options{ Addr: "10.23.1x.1x:6379", Password: "XixxxxxU", // no password set DB: 7, // use default DB }) _, err = rdb.Ping().Result() if err != nil { return err } return nil}//initClientS 哨兵模式func initClientS()(err error){ rdb := redis.NewFailoverClient(&redis.FailoverOptions{ MasterName: "master", SentinelAddrs: []string{"x.x.x.x:26379", "xx.xx.xx.xx:26379", "xxx.xxx.xxx.xxx:26379"}, }) _, err = rdb.Ping().Result() if err != nil { return err } return nil}// clusterfunc initClientC()(err error){ rdb := redis.NewClusterClient(&redis.ClusterOptions{ Addrs: []string{":7000", ":7001", ":7002", ":7003", ":7004", ":7005"}, }) _, err = rdb.Ping().Result() if err != nil { return err } return nil}func redisExample() { err := rdb.Set("score", 100, 0).Err() if err != nil { fmt.Printf("set score failed, err:%v\n", err) return } val, err := rdb.Get("score").Result() if err != nil { fmt.Printf("get score failed, err:%v\n", err) return } fmt.Println("score", val) val2, err := rdb.Get("name").Result() if err == redis.Nil { fmt.Println("name does not exist") } else if err != nil { fmt.Printf("get name failed, err:%v\n", err) return } else { fmt.Println("name", val2) }}func main() { ConnRedis() SetAndGet()}