在PostgreSQL Gorm中获取数据

huangapple go评论76阅读模式
英文:

Getting Data in PostgreSQL Gorm

问题

我有以下模型:

package models

import "github.com/lib/pq"

type Guild struct {
	Id               string         `json:"id" gorm:"primaryKey"`
	DefaultBitrate   int            `json:"defaultBitrate"`
	DefaultState     string         `json:"defaultState"`
	DefaultCategory  string         `json:"defaultCategory"`
	DefaultUserLimit int            `json:"defaultUserLimit"`
	HelpChannel      string         `json:"helpChannel"`
	Generators       pq.StringArray `json:"generators" gorm:"type:text[]"`
	Channels         pq.StringArray `json:"channels" gorm:"type:text[]"`
}

函数文件:

func (h handler) CreateGuild(guildid string) error {
	guild := &models.Guild{
		Id:             guildid,
		DefaultBitrate: "64",
	}
	if result := h.DB.Create(&guild); result.Error != nil {
		return result.Error
	}
	return nil
}
func (h handler) GetGuild(guildid string) (models.Guild, error) {
	var guild models.Guild
	if result := h.DB.First(&guild, guildid); result.Error != nil {
		return guild, result.Error
	}
	return guild, nil
}

所以我首先创建一个公会,然后尝试使用相同的ID获取它,但是我在控制台中没有得到任何日志记录。

Database := db.Init()
h := dbhandlers.New(Database)
data, err := h.GetGuild("71728137382983743892")
fmt.Print(data.DefaultBitrate)

Github: https://github.com/apidev234/abred

注意:我已经创建了这样的公会:

err := h.CreateGuild("71728137382983743892")

调试信息:

2022/03/24 13:37:23 /Users/gaurish/Desktop/Coding/TempVC-Bot/database/handlers/Functions.go:12 SLOW SQL >= 200ms
[1126.461ms] [rows:1] INSERT INTO "guilds" ("id","default_bitrate","default_state","default_category","default_user_limit","help_channel") VALUES ('ASDHA','64','','',0,'')
2022/03/24 13:37:44 /Users/gaurish/Desktop/Coding/TempVC-Bot/database/handlers/Functions.go:19 ERROR: column "asdha" does not exist (SQLSTATE 42703)
[229.439ms] [rows:0] SELECT * FROM "guilds" WHERE ASDHA ORDER BY "guilds"."id" LIMIT 1

数组:

func (h Handler) NewGenerator(guildid string, channelid string) {
	guild := models.Guild{
		Id: guildid,
	}
	if result := h.DB.First(&guild, "id = ?", guildid).Update("generators", append(guild.Generators, channelid)); result.Error != nil {
		return
	}
}
英文:

I Have my model as follows:

package models

import "github.com/lib/pq"

type Guild struct {
	Id               string         `json:"id" gorm:"primaryKey"`
	DefaultBitrate   int            `json:"defaultBitrate"`
	DefaultState     string         `json:"defaultState"`
	DefaultCategory  string         `json:"defaultCategory"`
	DefaultUserLimit int            `json:"defaultUserLimit"`
	HelpChannel      string         `json:"helpChannel"`
	Generators       pq.StringArray `json:"generators" gorm:"type:text[]"`
	Channels         pq.StringArray `json:"channels" gorm:"type:text[]"`
}

Functions File:

func (h handler) CreateGuild(guildid string) error {
	guild := &models.Guild{
		Id:             guildid,
		DefaultBitrate: "64",
	}
	if result := h.DB.Create(&guild); result.Error != nil {
		return result.Error
	}
	return nil
}
func (h handler) GetGuild(guildid string) (models.Guild, error) {
	var guild models.Guild
	if result := h.DB.First(&guild, guildid); result.Error != nil {
		return guild, result.Error
	}
	return guild, nil
}

So What i do is i create a guild first and then try to get it with the same id yet i don't get anything logged in the console

Database := db.Init()
	h := dbhandlers.New(Database)
	data, err := h.GetGuild("71728137382983743892")
	fmt.Print(data.DefaultBitrate)

Github: https://github.com/apidev234/abred

Note: I have already created the guild as such:

 err := h.CreateGuild("71728137382983743892")

Debugs:

2022/03/24 13:37:23 /Users/gaurish/Desktop/Coding/TempVC-Bot/database/handlers/Functions.go:12 SLOW SQL >= 200ms
[1126.461ms] [rows:1] INSERT INTO "guilds" ("id","default_bitrate","default_state","default_category","default_user_limit","help_channel") VALUES ('ASDHA','64','','',0,'')
2022/03/24 13:37:44 /Users/gaurish/Desktop/Coding/TempVC-Bot/database/handlers/Functions.go:19 ERROR: column "asdha" does not exist (SQLSTATE 42703)
[229.439ms] [rows:0] SELECT * FROM "guilds" WHERE ASDHA ORDER BY "guilds"."id" LIMIT 1

Array:

func (h Handler) NewGenerator(guildid string, channelid string) {
	guild := models.Guild{
		Id: guildid,
	}
	if result := h.DB.First(&guild, "id = ?", guildid).Update("generators", append(guild.Generators, channelid)); result.Error != nil {
		return
	}
}

答案1

得分: 1

当使用非数字主键的First方法时,您需要明确指定要与主键匹配的列。

官方文档(https://gorm.io/docs/query.html#Retrieving-objects-with-primary-key)中提到:

如果主键是字符串(例如,像uuid一样),查询将如下所示:

db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a")
// SELECT * FROM users WHERE id = "1b74413f-f3b8-409f-ac47-e8c062e3472a";

所以在GetGuild函数中,这段代码:

h.DB.First(&guild, guildid)

应该改为:

h.DB.First(&guild, "id = ?", guildid)
英文:

When using First with non-number primary keys you need to explicitly specify the column against which you want to match the primary key.

Official docs:

> If the primary key is a string (for example, like a uuid), the query
> will be written as follows:
>
> ```go
> db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a")
> // SELECT * FROM users WHERE id = "1b74413f-f3b8-409f-ac47-e8c062e3472a";

So in GetGuild this:

h.DB.First(&guild, guildid)

should be this:

h.DB.First(&guild, "id = ?", guildid)

huangapple
  • 本文由 发表于 2022年3月24日 15:40:28
  • 转载请务必保留本文链接:https://go.coder-hub.com/71598621.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定