问题标签 [sqlx]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - sql:列索引6上的扫描错误,名称“scheduled_date”:null:无法将类型[] uint8扫描到null.Time
我收到此错误并尝试了 Internet 和 stackoverlow 中可用的所有内容来解决此问题。我试图在使用 sqlx 包连接 MySQL db 并扫描结果后运行查询。我已经尝试过针对类似问题共享的解决方案,但对我没有任何帮助。
我得到的确切错误是
恐慌:sql:列索引6上的扫描错误,名称“sdate”:null:无法将类型[]uint8扫描为null。时间:[50 48 49 56 45 49 50 45 48 55 32 48 50 58 48 56 58 53 49]
语法方面,查询工作得很好,当我在 sql 工作台中运行它时,我得到了结果。我还尝试了 ParseTime=true 作为链接之一的建议。
go - 对于 cobra 应用程序,*sqlx.DB 对象应该保存在哪里?
我有一个使用包访问数据库的眼镜蛇项目sqlx
,该命令具有子命令。cobra 相关代码在cmd
文件夹/子包中,DB 相关代码在db
文件夹/子包中。
我想有包 db 有一个工厂功能
从cmd
包的某个地方调用。但我不确定在哪里调用它以及如何使其可用于所有子命令。
一种想法是在包中有一个全局变量,并在's或'scmd
中对其进行初始化。在这种情况下使用全局变量是否不好?root.go
init()
rootCmd
PersistentPreRun
如果我不使用全局变量,一种可能性是让子命令调用db.NewDB()
. 不知何故,这种方式也感觉不太好。
db.NewDB()
我发现在包中调用一次更好cmd
,可能在root.go
. 但是我应该在哪里保存数据库句柄以便子命令可以使用它?
sql - 高效地将一对多多对多数据库映射到 Golang 中的结构
问题
在 Golang 中处理一对多或多对多 SQL 关系时,将行映射到结构的最佳(高效、推荐、“Go-like”)方法是什么?
以下面的示例设置为例,我尝试详细说明每种方法的优缺点,但想知道社区推荐什么。
要求
- 适用于 PostgreSQL(可以是通用的,但不包括 MySQL/Oracle 特定功能)
- 效率 - 没有暴力破解每个组合
- 没有 ORM - 理想情况下只使用
database/sql
和jmoiron/sqlx
例子
为了清楚起见,我删除了错误处理
楷模
数据库
方法 1 - 选择所有项目,然后为每个项目选择标签
优点
- 简单的
- 容易明白
缺点
- 随着数据库查询的数量与项目数量成比例地增加,效率低下
方法 2 - 手动构建 SQL 连接和循环遍历行
优点
- 单个数据库调用和游标,可以在不消耗太多内存的情况下循环
缺点
- 结构上的多个连接和许多属性使开发变得复杂且困难
- 不太高效;更多的内存使用和处理时间与更多的网络调用
失败的方法 3 - sqlx 结构扫描
尽管失败了,但我想包含这种方法,因为我发现它是我目前的目标,即效率与开发简单性相结合。我希望通过db
在每个结构字段上显式设置标签sqlx
可以进行一些高级结构扫描
不幸missing destination name tag_id in *[]Item
的是,这个错误导致我相信StructScan
它不够先进,无法递归循环遍历行(没有批评 - 这是一个复杂的场景)
可能的方法 4 - PostgreSQL 数组聚合器和GROUP BY
虽然我确信这行不通,但我已经包含了这个未经测试的选项,看看它是否可以改进,以便它可以工作。
当我有时间时,我会尝试在这里进行一些实验。
sql - 从左连接的结果创建嵌套结构 - 你将如何改进我的方法?
我从 LEFT JOIN 的结果创建嵌套结构 - 你将如何改进我的代码/使其更惯用?
使用 Scan 会导致 nil 指针值出现问题,我想避免在结构中使用指针纯粹作为 LEFT JOIN 的解决方案。
我可以使用反射包而不是手动将列映射到结构吗?
sql - Go SQL 查询不一致
我在执行查询时遇到了一些非常奇怪的不一致,并且想知道是否有人知道原因。
想象一下,我有一个定义如下的结构:
和一个具有以下列的 MySQL 表:
我要执行的查询:
从表中选择 A、B、C、D,其中 A="a"
第一种执行方式:
第二种执行方式:
我遇到的不一致如下: 第一种方式执行查询时, Bfield 的类型为int
. 但是,当第二次执行查询时,它是[]uint8
.
例如,当 B 为 1 时,就会出现这种结果。
为什么 Bfield 的类型会根据查询的执行方式而有所不同?
连接声明:
编辑
使用 Go 数据库/sql 包 + 驱动程序也会发生这种情况。下面的查询分别分配Bfield
给[]uint8
和int64
。
db 的类型为 *sql.DB
查询1:
db.QueryRow(SELECT A, B, C, D FROM table WHERE A="a").Scan(&result.Afield, &result.Bfield, &result.Cfield, &result.Dfield)
--> 类型Bfield
是[]uint8
查询2:
db.QueryRow(SELECT A, B, C, D FROM table WHERE A=?, "a").Scan(&result.Afield, &result.Bfield, &result.Cfield, &result.Dfield)
--> 类型Bfield
是int64
编辑
还有一点需要注意的是,当链接多个 WHERE 子句时,只要使用 填充至少?
1 ,查询就会返回int
。否则,如果它们都填充在字符串中,它将返回[]uint8
mysql - MySQL 和 MariaDB SELECT 返回类型的区别
执行SELECT
查询并将结果存储在具有 type 字段的结构中时interface
,结果类型会有所不同int64
,[]uint8
具体取决于我使用的数据库是 MySQL 数据库还是 MariaDB。
这与我之前提出的一个问题(并得到了回答)有关:Go SQL query inconsistency
给定一个接口如下:
和数据库表:
我要执行的查询:
从表中选择 A、B、C、D,其中 A="a"
它是如何执行的:
问题
如果在 MySQL 数据库上执行,则类型Bfield
为int64
(desired),但如果在 MariaDB 上执行,则类型为[]uint8
。
为什么 Bfield 的类型不同,取决于查询是在 MySQL db 还是 MariaDB 上执行的?
可能有用的信息:
db 是 type: *sqlx.DB
,然后传递给执行查询的函数,其中 db 是 type Connection
。
postgresql - 如何使用 Golang lib/pq API 将二进制数据插入 PostgreSQL BYTEA 列?
我想在 BYTEA 列中插入一些二进制数据
我将如何将 somefile.tar.gz 的内容插入到具有 BYTEA 列的表中?
- 一个例子会有所帮助
- 是否可以使用 BYTEA 的 HEX 格式(postgres 9.2)?
- 是否可以从/到 golang 向/从 postgres 流式传输?
postgresql - 如何在postgres中查询timestamptz并与time.Time进行比较?
我正在使用 Postgres 10 和一个虚拟表
使用 jmoiron/sqlx 时,我无法time.Time
与timestamptz
. 示例代码是
我得到的结果说它们在最后一步不相等
我应该怎么做才能reflect.DeepEqual
认为两者都是平等的?