我正在使用sqlx编写我的第一个 Go 项目,并想使用准备好的语句。
我不确定以一种很好的可管理方式初始化和保留 Prepared 语句变量的推荐做法是什么。
我希望它们只能从实际必须使用它们的代码部分访问,到目前为止,每个语句都由单个函数使用,因此全局变量不是一个好的选择(除了通常不受欢迎之外)。
在 C/C++ 中,我可能会使用函数静态变量并在第一次输入函数时对其进行初始化。这样,有关语句内容的信息和使用它的调用彼此接近。
但是据我目前所知,Go 中没有“方法静态变量”,那么有什么选择呢?
我找到了对 Closures 的引用,它们是匿名函数,但这是实现此目的的最佳方法吗?从“准备好的报表最佳实践”的角度来看,我的目标是正确的吗?
我有一个带有属性时间的结构:
type Basket struct {
...
Created_at time.Time `db:"created_at"`
}
Run Code Online (Sandbox Code Playgroud)
时间保存为:
basket.Created_at = time.Now().UTC()
Run Code Online (Sandbox Code Playgroud)
如果我使用 Insert sql 语句保存它,它会在 SQLite3 中很好地节省时间,但是当我使用以下命令选择所需的记录时:
ret_basket := Basket{}
err := database.DB.Get(&ret_basket, "SELECT id, ..., created_at FROM baskets WHERE user_id = ?", some_user_id)
Run Code Online (Sandbox Code Playgroud)
它返回具有正确加载的其他属性的记录,除了ret_basket.Created_at作为0001-01-01 00:00:00 +0000 UTC
有什么建议?
我想在mysql数据库中查询一个表的值IN:
var qids []int
//fill qids dynamically
err = database.SQL.Select("es,
"SELECT * FROM quote WHERE qid IN $1", qids)
if err != nil {
log.Println(err)
}
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
sql: converting Exec argument #0's type: unsupported type []int, a slice
quotes []
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
简而言之,我的问题是:我可以使用 sqlx 的 StructScan 用来自连接两次的同一个 SQL 表的值填充两个嵌入式结构吗?
有用的 sqlx 包的帮助文件说明了这一点:
StructScan 将在 Person.AutoIncr.ID 中设置 id 列结果,也可以通过 Person.ID 进行访问。为了避免混淆,建议您使用 AS 在 SQL 中创建列别名。
假设我有这个 SQL 查询(父子、人到电话):
func getSQL() string {
return `SELECT *
FROM person
LEFT JOIN phones AS Phone1 ON Phone1.phone_id = person_phoneID1
LEFT JOIN phones AS Phone2 ON Phone2.phone_id = person_phoneID2
WHERE people_id = 1;`
}
Run Code Online (Sandbox Code Playgroud)
使用 sqlx 和 StructScan,我想填充一个充满嵌入式结构的结构,如下所示:
//Struct with embedded structs
type personHelper struct{
Person
Phone1 //Should I use the same name as SQL …Run Code Online (Sandbox Code Playgroud) 我正在使用SQLX和PQ通过PostGress查询SQL数据库。我正在使用带有绑定变量的“从SQLX选择”功能,但带有
pq:有1个参数,但该语句需要0。
query = `
SELECT
count(*) AS count
FROM
ledger
WHERE
enterprise_id=($1)
`
var stat singleStat
err = db.Select(&stat, query, enterpriseID)
Run Code Online (Sandbox Code Playgroud) 一段时间不活动后,我的 go web 服务在执行第一个 postgres sql 查询时收到一条net.OpError消息read tcp x.x.x.x:52086->x.x.x.x:24414: read: connection reset by peer。错误后,后续请求将正常工作。
postgres 数据库由 compose.com 托管,它在 postgres db 前面有 haproxy。我的 go web 应用程序使用标准 sql 和 sqlx。
我试过db.Ping()每 15 分钟运行一次自动收报机,但这并没有解决问题。
为什么 go 标准sql库不处理这些连接中断?
或者,我还需要哪些额外的进口?
我想开始使用 Postgres 作为我正在进行的一些开发的主要 DBMS,我的研究表明这pgx是目前选择的数据库驱动程序。我已经设置了一个连接包:
package database
import (
"fmt"
_ "github.com/jackc/pgx/v5"
"net/url"
"github.com/jmoiron/sqlx"
log "github.com/sirupsen/logrus"
)
func PgConnect(username, password, host, app string) *sqlx.DB {
s := fmt.Sprintf("postgres://%s:%s@%s?app+name=%s&sslmode=allow", url.QueryEscape(username), url.QueryEscape(password), host, app)
db, err := sqlx.Connect("postgres", s)
if err != nil {
log.Panicf("failed to connect to sqlserver://%s:%s@%s err: %s", username, "xxxxxxxxxxxx", host, err)
}
return db
}
Run Code Online (Sandbox Code Playgroud)
URL 的计算结果为:
postgres://user:password@database-host:5432/database-name?app+name=app-name&sslmode=allow
Run Code Online (Sandbox Code Playgroud)
我也尝试过postgresql这里的前缀,因为我在互联网上的地方都看到过这两个前缀。
对于呼叫中的驱动程序名称sqlx.Connect("postgres", s)我已尝试过postgres,postgresql并且pgx。
在所有情况下,对 connect 的调用都会失败并出现错误:
sql: unknown …Run Code Online (Sandbox Code Playgroud) 我正在使用sqlx与mysql数据库,并希望查询author表中以某些字母开头的名称.这是查询:
sqlx.DB.Select(&authors, "SELECT * FROM author WHERE first_name LIKE ?% OR last_name LIKE ?%", letter,letter)
Run Code Online (Sandbox Code Playgroud)
但我明白了
您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在'%OR last_name LIKE?%'附近使用正确的语法
我查看了文档中的LIKE查询示例,但找不到任何查询.所以想知道如何解决这个问题?
我刚刚开始学习 Go 语言。我写了以下简单的程序。
在这里,我试图用所有书籍和相关作者填充结构。
Bookstruct 已嵌入Author结构。
package main
import (
"fmt"
"log"
"time"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
)
type Book struct {
ID int
Title string
Year int
Bauther Auther `db:"auther"`
}
type Auther struct {
ID int
Name string
Dob time.Time
}
func main() {
db, err := sqlx.Open("postgres", "host=localhost user=testuser dbname=testdb password=testuser")
if err != nil {
log.Fatal("DB Conn error: ", err)
}
if err = db.Ping(); err != nil {
log.Fatal("DB Ping error: ", err) …Run Code Online (Sandbox Code Playgroud) 使用sqlx,我想知道查询 MySql 数据库以了解对 MySql 的查询是否返回空行:
所以在这个之后,我想出了
var result model.Post
err := database.SQL.Get(&result, "SELECT * FROM post WHERE post_id=? AND user_id=? LIMIT 1", postID, userID)
if err == sql.ErrNoRows {
log.Println(err)
log.Println("post not found")
} else {
log.Println("post found")
}
Run Code Online (Sandbox Code Playgroud)
但我总是得到post found,尽管事实上没有行。
这里可能有什么问题,我该如何解决?