- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
具有此表结构:
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.Scanner
和 sql.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/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!