gpt4 book ai didi

mysql - sql.DB.Exec 时对 SQL 中的自定义类型感到困惑

转载 作者:IT王子 更新时间:2023-10-29 01:20:16 25 4
gpt4 key购买 nike

具有此表结构:

CREATE TABLE `tableName` (
`Id` int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
`Status` enum('pending','rejected','sent','invalid') NOT NULL,
`Body` varchar(255) NULL
) ENGINE='MyISAM' COLLATE 'utf8_general_ci';

我有这段(不完整的)代码工作正常:

type StatusEnum string

const (
STATUS_PENDING StatusEnum = "pending"
STATUS_REJECTED StatusEnum = "rejected"
STATUS_SENT StatusEnum = "sent"
STATUS_INVALID StatusEnum = "invalid"
)

func (s *StatusEnum) Scan(src interface{}) error {
if src == nil {
return errors.New("This field cannot be NULL")
}

if stringStatus, ok := src.([]byte); ok {
*s = StatusEnum(string(stringStatus[:]))

return nil
}

return errors.New("Cannot convert enum to string")
}

func (s *StatusEnum) Value() (driver.Value, error) {
return []byte(*s), nil
}

type EmailQueue struct {
Id uint64
Status StatusEnum
Body sql.NullString
}

func Save (db *sql.DB) error {
_, err = db.Exec(
"UPDATE `tableName` SET `Status` = ?, `Body` = ? WHERE `id` = ?",
&eqi.Status,
eqi.Body,
eqi.Id,
)

return err
}

所以我的问题是:为什么我需要在 db.Exec 上使用指针引用 (&eqi.Status)?

sql.NullString 和我自定义的StatusEnum 都没有在github.com/go-sql-driver/mysql 中实现,所以为什么有区别吗?

如果我不使用指针引用 (eqi.Status),我会收到此错误(抛出 database/sql/convert.go ):

sql: converting Exec argument #0's type: unsupported type emailqueue.StatusEnum, a string

我试图实现我发现的一些其他接口(interface),但没有成功。

我还有其他使用 sql.Scannersql.driver.Valuer 接口(interface)实现的自定义类型,但问题是一样的。

我在猜测 struct 和类型继承差异,但我无法得到任何提示...... :(

请帮助理解发生了什么。谢谢!!! :)

最佳答案

您实现 Valuer interface对于您的 StatusEnum 类型,在 *StatusEnum 上运行。因此,当您将一个作为参数传递给 Exec 时,它仅作为指针才有意义,因为只有指向 StatusEnum 的指针才能实现 Value(),这需要内联引用。

您没有 EmailList 类型的定义,因此我可以建议对给定的 Valuer 接口(interface)进行更改。

func (s StatusEnum) Value() (driver.Value, error) {
return []byte(s), nil
}

这是标准库 implements自定义可空类型。

关于mysql - sql.DB.Exec 时对 SQL 中的自定义类型感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30277296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com