为什么 JSONB 以字符串形式返回?
短信预约 -IT技能 免费直播动态提醒
问题内容
我已经启动了一个“instagram 克隆”后端来尝试学习有关 golang 的知识,但我遇到了一个不知道如何解决的问题。
我用 fiber 构建了一个简单的 api,可以获取一些帖子:
package server
import (
"fmt"
"instagram/internal/psql"
queries "instagram/internal/sql"
"net/http"
"github.com/gofiber/fiber/v2"
)
type like struct {
username string
name string
picture string
}
type post struct {
id string `json:"id"`
description string `json:"description"`
media string `json:"media"`
type string `json:"type"`
likes string `json:"likes"`
user_id string `json:"user_id"`
created_at string `json:"created_at"`
updated_at string `json:"updated_at"`
}
func listposts(c *fiber.ctx) error {
rows, err := psql.db().query(queries.getallposts)
if err != nil {
c.sendstatus(400)
return nil
}
defer rows.close()
var data []post
for rows.next() {
var post post
err := rows.scan(&post.id, &post.description, &post.media, &post.type, &post.created_at, &post.updated_at, &post.likes, &post.user_id)
if err != nil {
fmt.print(err)
c.sendstatus(400)
return nil
}
data = append(data, post)
}
return c.status(http.statusok).json(data)
}
问题是 likes
属性作为字符串返回:
[
{
"id": "...",
"description": "...",
"media": "...",
"type": "...",
"likes": "[]",
"user_id": "...",
"created_at": "...",
"updated_at": "..."
}
]
我尝试了一些东西,比如使用 json.marshal(data)
,我还写了 like
结构,但我无法使其工作,因为当我将 likes
的类型从 string
更改为 []like
时调用扫描时出现以下消息
sql: scan error on column index 6, name "likes": unsupported scan, storing driver.value type []uint8 into type *[]server.likesql: scan error on column index 6, name "likes": unsupported scan, storing driver.value type []uint8 into type *[]server.like
我正在使用 postgresql 数据库,并且我第一次尝试使用 jsonb
列,因此 likes
在数据库中是 jsonb
列。
我理想的有效负载是这样的:
[
{
"id": "...",
"description": "...",
"media": "...",
"type": "...",
"likes": [],
"user_id": "...",
"created_at": "...",
"updated_at": "..."
}
]
请注意,likes
现在是一个数组而不是字符串。那么有人知道如何解决这个问题吗?
正确答案
您很可能需要实现 sql.driver
的接口来“知道”如何扫描到您的结构,可能类似于
type Like struct {
Username string
Name string
picture string
}
type Likes []Like
func (l Likes) Value() (driver.Value, error) {
return json.Marshal(l)
}
// Make the Likes implement the sql.Scanner interface.
func (l *Likes) Scan(value interface{}) error {
b, ok := value.([]byte)
if !ok {
return errors.New("type assertion to []byte failed")
}
return json.Unmarshal(b, &l)
}
以上就是为什么 JSONB 以字符串形式返回?的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
为什么 JSONB 以字符串形式返回?
下载Word文档到电脑,方便收藏和打印~
下载Word文档
猜你喜欢
为什么 JSONB 以字符串形式返回?
问题内容我已经启动了一个“instagram 克隆”后端来尝试学习有关 golang 的知识,但我遇到了一个不知道如何解决的问题。我用 fiber 构建了一个简单的 api,可以获取一些帖子:package serverimport
2024-02-06
CreateProcess和CreatePipe在VC ++中执行进程并以字符串形式返回输出
以下是在VC ++中使用CreateProcess和CreatePipe执行进程并以字符串形式返回输出的示例代码:```cpp#include #include #include std::string ExecuteCommand(con
2023-09-27
php count字符串返回的是什么
本篇文章为大家展示了php count字符串返回的是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。php count字符串返回“1”。原因:count()是一个数组方法,可返回数组中元素的数目;
2023-06-29
Python怎么将字符串转换为大写或小写形式
Python中可以使用字符串的方法upper()和lower()来将字符串转换为大写和小写形式。示例代码:string = "Hello, World!"upper_string = string.upper()lower_stri
2024-03-02
如果搜索字符串不在 FIELD() 函数中作为参数提供的字符串列表中,MySQL 将返回什么?
假设如果搜索字符串不在FIELD()函数中作为参数提供的字符串列表中,那么MySQL将返回0作为输出。示例mysql> Select FIELD(Ram,New,Delhi);+----------------------------+
2023-10-22
2023-05-14
php怎么将time()获取的值转为日期字符串形式
在php中,可以使用date()函数将time()返回的值转为日期字符串形式,语法“date("Y-m-d H:i:s",time())”。time()会返回代表当前时间的时间戳,而date()可以格式化时间戳,并返回已格式化的日期字符串。
2014-05-01
2024-04-25
为什么 Python 中的 f-string 可以连接字符串与数字
这篇文章主要讲解了“为什么 Python 中的 f-string 可以连接字符串与数字”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么 Python 中的 f-string 可以连接字符
2023-06-15
python中内置函数ord()返回字符串的ASCII数值是什么
这篇文章主要介绍“python中内置函数ord()返回字符串的ASCII数值是什么”,在日常操作中,相信很多人在python中内置函数ord()返回字符串的ASCII数值是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
2023-07-02
为什么可以Python中使用f-string 连接字符串与数字
本篇文章为大家展示了为什么可以Python中使用f-string 连接字符串与数字,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面以字符串和数字为例,看看强行操作会产生什么结果:>>> "Pyth
2023-06-06
如果要删除的字符数超过原始字符串中可用的字符数,MySQL INSERT() 函数会返回什么?
如果要删除的字符数超过原始字符串中可用的字符数,则 MySQL INSERT() 函数将继续删除字符,直到原始字符串末尾。示例mysql> Select INSERT(myteststring,3,15,original);+-------
2023-10-22
Java中将接口返回的字节串转为文件的方法是什么
本篇内容主要讲解“Java中将接口返回的字节串转为文件的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中将接口返回的字节串转为文件的方法是什么”吧!讲一下现在的需求场景最近公司
2023-06-25
如果我们在 LPAD() 或 RPAD() 函数中提供一个空字符串来填充其他字符串,MySQL 将返回什么?
假设如果我们在 LPAD() 或 RPAD() 函数上提供一个空字符串用于填充,那么 MySQL 将返回 NULL 作为输出。以下示例将演示它 -示例mysql> Select LPAD(ABCD,22,);+---------------
2023-10-22
c++11多种格式时间转化为字符串的实现方法是什么
c++11多种格式时间转化为字符串的实现方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.打印系统当前时间,或者将系统当前时间转化为字符串#include
2023-06-21
在日期和时间部分之间使用“T”或“空格”以外的任何其他字符时,MySQL 返回什么?
在这种情况下,MySQL 将返回时间处的全零以及正确的日期部分。如下所示,我们在日期和时间部分之间的“T”或“Space”位置使用字符“W” -mysql> Select TIMESTAMP(2017-10-20W06:10:36);+-
2023-10-22
如果原始字符串的长度大于 LPAD() 或 RPAD() 函数中指定的参数长度,MySQL 将返回什么?
在这种情况下,MySQL不会填充任何内容,并且会从原始字符串中截取字符,直到LPAD()或RPAD()函数中提供的长度值为止。示例mysql> Select LPAD(ABCD,3,*);+--------------------+|
2023-10-22
编程热搜
Python 学习之路 - Python
一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-chatgpt的中文全称是什么
chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列C/C++可变参数的使用
可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃Python 3 教程
Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 PythonPython pip包管理
一、前言 在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install 和 pip , 目前官方推荐使用 pip。
编程资源站
- 资料下载
- 历年试题