这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记
服务器demo开发记录
Gorm默认表名复数
表名,列名如何对应结构体
在Gorm中,表名是结构体名的复数形式,列名是字段名的蛇形小写。
即,如果有一个user表,那么如果你定义的结构体名为:User,gorm会默认表名为users而不是user。
db.SingularTable(true) // 如果设置为true,`User`的默认表名为`user`,使用`TableName`设置的表名不受影响
这样的话,表名默认即为结构体的首字母小写形式。
func TestGorm(c *gin.Context) { //"gorm.io/driver/mysql"
fmt.Println("TestGorm函数:")
db, err := gorm.Open(
mysql.Open("root:root@tcp(127.0.0.1:3306)/mydb"),
)
if err != nil {
fmt.Println(err)
}
// db.SingularTable(true)用了这个数据库用Student
var student Student
db.First(&student, 1) // 根据整型主键查找
//err = db.Select("id", "name").Find(&student, "1").Error
c.JSON(http.StatusOK, TestDBResponse{
Response: Response{StatusCode: 0, StatusMsg: "TestGorm成功"},
Student: student,
})
}
登陆网络异常,解决跨域的中间件函数
GO服务运行apk文件
电脑连接校园网,电脑开移动热点,手机连接电脑热点,手动配置这个WiFi代理,配置成电脑ip+端口。手机登录注册电脑可收到消息。
我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正常访问到我们的服务,这是为什么呢?我们可以这样来理解:Android的底层是Linux kernel,包括Android本身就是一个操作系统,因此,这时我们在模拟器的浏览器中输入的localhost或127.0.0.1所代表的是Android模拟器(Android虚拟机),而不是你的电脑,明白了吗?这就是为什么你在模拟器中使用localhost时会报“Web page not available”的原因。 那到底要如何才能访问到本地电脑上的Web应用呢?在Android中,默认将我们本地电脑的地址映射为10.0.2.2,因此,只需要将原先的localhost或者127.0.0.1换成10.0.2.2,就可以在模拟器上访问本地计算机上的Web资源了。
ShouldBind
能够基于请求的不同,自动提取JSON、form表单和QueryString类型的数据,并把值绑定到指定的结构体对象
电脑adb连接木木模拟器
环境遍历配置C:\Program Files (x86)\MuMu\emulator\nemu\vmonitor\bin
adb connect 127.0.0.1:7555
adb devices
木木模拟器连接服务器地址10.0.2.2:8080,app里baseurl配置这个
静态资源访问失败
已经加了代码r.Static("/static", "./public")。http://localhost:8080/static/hcl_1.jpg,postman这样可以,但是放在coverurl里不行。
解决了,http://10.0.2.2:8080/static/bear.mp4。因为localhost访问的是手机模拟机里的本地文件。要用服务器地址,木木模拟器连接的是10.0.2.2:8080。
MySQL表里关联表的结构体与数据库设计
写成结构体类型,mysql里不显示这个结构体类型(外键)。
!(file:///C:\Users\hcl\Documents\Tencent Files\1379130749\Image\C2C\Image1\0ZSD8{NS@`N56{QL1S9O@24.png)
``
type Video struct {
Id int64 `gorm:"primaryKey autoIncrement" json:"video_id,omitempty"`
Author User `gorm:"-" json:"author"` //默认关联主键
PlayUrl string `json:"play_url" json:"play_url,omitempty"`
CoverUrl string `json:"cover_url,omitempty"`
FavoriteCount int64 `json:"favorite_count,omitempty"`
CommentCount int64 `json:"comment_count,omitempty"`
IsFavorite bool `json:"is_favorite,omitempty"`
Title string `json:"title,omitempty"`
}
如何将电脑里的文件导入到模拟器
点击模拟器底部“文件共享”按钮,打开MuMu共享文件夹;
模拟器有网络,可以访问七牛云网址看视频。APP里看不到视频
数据库里的存url时没加http://
结构体与表名
database := cfg.Database
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local",
database.Username, database.Password, database.Host, database.Port, database.DbName, database.Charset)
MySQLDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: "t_", // 表名前缀
SingularTable: true, // 使用单数表名,启用该选项,此时,`User` 的表名应该是 `t_user`
},
})
json字段是sql语句where里用到的
注意!!!,where里有问号?
database.MySQLDB.Model(&model.Video{}).Where("user_id = ?", u.ID).Find(&videos)
数组append
var names []string
for key, _ := range urls {
names = append(names, key)
}
fmt.Println(names,len(names))
外键的坑
type User struct {
gorm.Model
Name string `gorm:"serializer:varchar(20);not null"`
Permission []UserPermission `gorm:"foreignKey:UserId"` // 注意这里的UserId需要和UserPermission里面的UserID对应,并且首字母一定要大写
}
type UserPermission struct {
gorm.Model
UserId uint // todo UserID一定要大写
Name string `gorm:"serializer:varchar(10); not null"`
}
AutoMigrate
可用于建表。增加struct字段时类似mongo自动加列。很灵活很方便。
db.AutoMigrate(&Product{})
\