gorm+postgersql一些使用整理

1:实例化连接:

对于的配置信息为:

datasource_postgersql:
    driverName: postgres
    host: localhost
    port: 5432
    database: xmly_code_go
    username: postgres
    password: 123456
    dbSslmode: disable

连接的示例

//打印链接的额数据库的参数信息
    driverName := viper.GetString("datasource_postgersql.driverName")
    host := viper.GetString("datasource_postgersql.host")
    port := viper.GetString("datasource_postgersql.port")
    database := viper.GetString("datasource_postgersql.database")
    username := viper.GetString("datasource_postgersql.username")
    password := viper.GetString("datasource_postgersql.password")
    //格式化链接PG数据库--端口号的地方注意必须是字符串的形式
    global.GVA_DB, err = gorm.Open(driverName, fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s sslmode =disable",
        host,
        port,
        username,
        database,
        password,
    ))
    if err != nil {
        panic("数据库连接失败,请检查参数")
    }

2:分页查询数据列表

//表模型的
type User struct {
    gorm.Model
    Username string `gorm:"type:varchar(20);not null " json:"username" validate:"required,min=4,max=12" label:"用户名"`
    Password string `gorm:"type:varchar(20);not null" json:"password" validate:"required,min=6,max=20" label:"密码"`
    Role     int    `gorm:"type:int;DEFAULT:2" json:"role" validate:"required,gte=2" label:"角色码"`
}
//表的逻辑处理-----返回用戶列表信息,分页的返回,返回的切片的类型的数据
// 查询用户列表
func GetUsers(pageSize int, pageNum int) ([]User, int) {
    var users []User
    var total int
    if pageNum == 0 {
        pageNum = 1
    }
    index := (pageNum - 1) * pageSize
    //执行分页和返回总数
    if err = global.GVA_DB.Limit(pageSize).Offset(index).Find(&users).Count(&total).Error; err != nil && err != gorm.ErrRecordNotFound {
        // 错误处理...
        return nil, 0
    }
    return users, total
}

3:单表的核查

//表模型的
type User struct {
    gorm.Model
    Username string `gorm:"type:varchar(20);not null " json:"username" validate:"required,min=4,max=12" label:"用户名"`
    Password string `gorm:"type:varchar(20);not null" json:"password" validate:"required,min=6,max=20" label:"密码"`
    Role     int    `gorm:"type:int;DEFAULT:2" json:"role" validate:"required,gte=2" label:"角色码"`
}

//db.First(&model).ForUpdate

//表的逻辑处理-----检测用户信息是否已存在
func CheckUser(name string) (code int) {
    var users User
    //db.Where("name = ?", "jinzhu").First(&user)
    global.GVA_DB.Select("id").Where("username = ?", name).First(&users)
    if users.ID > 0 {
        return errmsg.ERROR_USERNAME_USED //1001
    }
    return errmsg.SUCCSE
}

4:使用代码的形式添加外键信息的时候异常(字符串转义问题异常)

异常语句SQL:

 ALTER TABLE "articles" ADD CONSTRAINT articles_user_id_user_user_id_foreign FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE RESTRICT ON UPDATE RESTRICT

对应GORM示例

    //创建外键
        if err2 := db.Model(&Articles{}).
            AddForeignKey("user_id", "user(user_id)", "RESTRICT", "RESTRICT").Error; err2 != nil {
            panic(err2)
        }

提示异常问题:


image.png

解决处理:
分析正常的可以执行插入的SQL

ALTER TABLE "articles" ADD CONSTRAINT articles_user_id_user_user_id_foreign FOREIGN KEY ( user_id ) REFERENCES "user"  ( user_id ) ON DELETE RESTRICT ON UPDATE RESTRICT
===============
 ALTER TABLE "articles" ADD CONSTRAINT articles_user_id_user_user_id_foreign FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE RESTRICT ON UPDATE RESTRICT

区别在于REFERENCES "user"  和  REFERENCES uesr

解决问题:

if err2 := db.Model(&Articles{}).
            AddForeignKey("user_id", "\"user\""+"(user_id)", "RESTRICT", "RESTRICT").Error; err2 != nil {
            panic(err2)
}
或
 if err2 := db.Model(&Articles{}).
            AddForeignKey("user_id", `"user"`+"(user_id)", "RESTRICT", "RESTRICT").Error; err2 != nil {
            panic(err2)
        }

连接查询一样的问题:

func GetArticlesList(page, pageSize uint) (data *PaginationQ, err error) {
    q := PaginationQ{
        PageSize: pageSize,
        Page:     page,
        Data:     &[]ArticlesInfo{},
    }

    return q.SearchAll(db.Model(&Articles{}).
        Where(&Articles{Status: PublishedArticlesStatus}).
        Select("articles.*, user.*").
        Joins("left join \"user\" on \"user\".user_id = \"articles\".user_id"))

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355