- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
几周前,我开始学习 go 并尝试在学习基础知识的同时构建一个简单的博客应用程序。
目前我正在尝试使用 database/sql
和 github.com/lib/pq
包来获取和保存博客文章。我不喜欢在不完全了解 native 行为和 go 基础知识的情况下使用 3rd 方包,如 sqlx
或 gorm
。
我的 Post
结构是这样的:
type Post struct {
Id int
Title string
Body string
Tags json.RawMessage
}
当保留帖子时,我的 save()
函数可以正常工作:
func (p *Post) save() (int, error) {
const query = `INSERT INTO post (title, body, tags) VALUES($1, $2, $3) RETURNING id`
db := GetDB()
var postid int
err := db.QueryRow(query, p.Title, p.Body, p.Tags).Scan(&postid)
return postid, err
}
为了阅读最新的帖子,我写了一个小函数:
func getLatestPosts(page int) (*[]Post, error) {
const query = `SELECT id, title, body, tags FROM posts ORDER BY id DESC LIMIT 10`
var items []Post
db := GetDB()
rows, err := db.Query(query)
if err != nil {
return nil, err
}
for rows.Next() {
var item Post
if err := rows.Scan(&item.Id, &item.Title, &item.Body, &item.Tags); err != nil {
log.Fatal(err)
}
items = append(items, item)
}
return &items, err
}
这也有效,直到遇到标签列为空的帖子行,此时我收到以下错误:
2015/04/16 21:53:04 sql: Scan error on column index 4: unsupported driver -> Scan pair: -> *json.RawMessage
我的问题是,在扫描结果集时处理 nullable json
列的正确方法是什么?此错误是否与 lib/pq
相关?
我的模式是:
CREATE TABLE post (
"id" int4 NOT NULL DEFAULT nextval('post_id_seq'::regclass),
"title" varchar(255) NOT NULL COLLATE "default",
"body" text COLLATE "default",
"tags" json,
PRIMARY KEY ("id") NOT DEFERRABLE INITIALLY IMMEDIATE
);
这是一个已经存在的(非空)tags
字段内容:
{
"black-and-white" : "Black and White",
"the-godfather" : "The Godfather"
}
有什么想法吗?
最佳答案
TL;DR:将您的结构更改为具有 Tags *json.RawMessage
或使用该类型的临时变量。
注意你可以search the Go source对于错误消息,如果您有兴趣,可以更好地了解幕后发生的事情(标准包大多是编写良好的 Go 代码的良好来源)。
我使用下表对新的 PostgreSQL-9.4.1 服务器进行了测试:
CREATE TABLE post (
"id" serial PRIMARY KEY,
"title" varchar(255) NOT NULL,
"body" text,
"tags" json
);
(顺便说一句,最好给出重新创建的命令,或者用于创建表的位置,而不是使用不能直接使用的形式。另外,当我熟悉 PostgreSQL 时我记得很少有 varchar
列不是错误的,而不仅仅是使用 text
,可能有长度限制。)
将该表与我得到的结构类型一起使用:
converting Exec argument #2's type: unsupported type json.RawMessage, a slice
在插页上。更改为 []byte(p.Tags)
使它消失(但请参见下文),然后查询按原样进行。
当我将 NULL 值放入表中时,我只遇到了与查询时相同的错误。解决方案是将结构字段更改为 Tags *json.RawMessage
。然后我可以删除我在插入时添加的转换,并且查询工作正常,将字段设置为 nil
或不适当。
如果这样做,请不要忘记在使用前检查 item.Tags
是否为 nil
。或者,使数据库字段 NOT NULL
。
我不太熟悉 Go 的数据库支持,不知道需要一个指向 slice 的指针来处理 NULL 是否合理;我本来希望不会,因为 Go 已经区分了空 slice 和 nil slice 。
或者,您可以保留您的类型并使用这样的临时类型:
var item post
var tmp *json.RawMessage
if err := rows.Scan(&item.Id, &item.Title, &item.Body, &tmp); err != nil {
log.Fatal(err)
}
if tmp != nil {
item.Tags = *tmp
}
当您使用 NULL 正文进行测试时,您可能会遇到类似的问题。使数据库列 NOT NULL
或使用 sql.NullString
,在您的类型中或作为上面的临时列(使用 Valid
字段NullString
以查看是否应复制该字符串)。
一些其他的小注意事项:
golint
建议使用 ID
而不是 Id
。GetDB
实现,我希望它只是获得共享/全局*sql.DB
。您不想重复调用 sql.Open
。getLatestPosts
函数返回*[]Post
;不要那样做。只需返回 []Post
。您几乎不想使用指向 slice 的指针,当然也不想将其用作返回类型。关于sql - 如何避免可空 JSON 列上的扫描对 : <nil> *json. RawMessage 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29706727/
最近开始学习MongoDB。今天老师教了我们 mongoexport 命令。在练习时,我遇到了一个典型的问题,包括教练在内的其他同学都没有遇到过。我在我的 Windows 10 机器上使用 Mongo
我是 JSON Schema 的新手,读过什么是 JSON Schema 等等。但我不知道如何将 JSON Schema 链接到 JSON 以针对该 JSON Schema 进行验证。谁能解释一下?
在 xml 中,我可以在另一个 xml 文件中包含一个文件并使用它。如果您的软件从 xml 获取配置文件但没有任何方法来分离配置,如 apache/ngnix(nginx.conf - site-av
我有一个 JSON 对象,其中包含一个本身是 JSON 对象的字符串。我如何反序列化它? 我希望能够做类似的事情: #[derive(Deserialize)] struct B { c: S
考虑以下 JSON { "a": "{\"b\": 12, \"c\": \"test\"}" } 我想定义一个泛型读取 Reads[Outer[T]]对于这种序列化的 Json import
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 11 个月前关闭。 Improve
我的旧项目在 MySQL 中有 Standard JSON 格式的数据。 对于我在 JS (Node.js) 和 DynamoDB 中的全新项目,关于 Standard JSON格式: 是否建议将其转
JSON 值字符串、数字、true、false、null 是否是有效的 JSON? 即,是 true 一个有效的 JSON 文档?还是必须是数组/对象? 一些验证器接受这个(例如 http://jso
我有一个 JSON 字符串,其中一个字段是文本字段。这个文本字段可以包含用户在 UI 中输入的文本,如果他们输入的文本是 JSON 文本,也许是为了说明一些编码,我需要对他们的文本进行编码,以便它不会
我正在通过 IBM MQ 调用处理数据,当由 ColdFusion 10 (10,0,11,285437) 序列化时,0 将作为 +0.0 返回,它会导致无效的 JSON并且无法反序列化。 stPol
我正在从三个数组中生成一个散列,然后尝试构建一个 json。我通过 json object has array 成功了。 require 'json' A = [['A1', 'A2', 'A3'],
我从 API 接收 JSON,响应可以是 30 种类型之一。每种类型都有一组唯一的字段,但所有响应都有一个字段 type 说明它是哪种类型。 我的方法是使用serde .我为每种响应类型创建一个结构并
我正在下载一个 JSON 文件,我已将其检查为带有“https://jsonlint.com”的有效 JSON 到文档目录。然后我打开文件并再次检查,结果显示为无效的 JSON。这怎么可能????这是
我正在尝试根据从 API 接收到的数据动态创建一个 JSON 对象。 收到的示例数据:将数据解码到下面给出的 CiItems 结构中 { "class_name": "test", "
我想从字符串转换为对象。 来自 {"key1": "{\n \"key2\": \"value2\",\n \"key3\": {\n \"key4\": \"value4\"\n }\n
目前我正在使用以下代码将嵌套的 json 转换为扁平化的 json: import ( "fmt" "github.com/nytlabs/gojsonexplode" ) func
我有一个使用来自第三方 API 的数据的应用程序。我需要将 json 解码为一个结构,这需要该结构具有“传入”json 字段的 json 标签。传出的 json 字段具有不同的命名约定,因此我需要不同
我想使用 JSON 架构来验证某些值。我有两个对象,称它们为 trackedItems 和 trackedItemGroups。 trackedItemGroups 是组名称和 trackedItem
考虑以下案例类模式, case class Y (a: String, b: String) case class X (dummy: String, b: Y) 字段b是可选的,我的一些数据集没有字
我正在存储 cat ~/path/to/file/blah | 的输出jq tojson 在一个变量中,稍后在带有 JSON 内容的 curl POST 中使用。它运作良好,但它删除了所有换行符。我知
我是一名优秀的程序员,十分优秀!