标签: go-pg

在 Go 中包装 db 对象并在同一事务中运行两个方法

为了更好地学习 Go,我尝试将一系列接受数据库连接作为第一个参数的函数重构为结构方法和一些更“惯用”的 Go 语言。

现在我的“数据存储”方法是这样的:

func CreateA(db orm.DB, a *A) error {
    db.Exec("INSERT...")
}

func CreateB(db orm.DB, b *B) error {
    db.Exec("INSERT...")
}
Run Code Online (Sandbox Code Playgroud)

这些功能运行得很好。orm.DBgo-pg 的数据库接口

由于这两个函数接受数据库连接,我可以传递实际连接或事务实现相同的接口)。我可以确定发出 SQL INSERT 的两个函数在同一事务中运行,从而避免在其中一个函数失败时数据库中出现不一致的状态。

当我决定阅读更多有关如何更好地构造代码并使其“可模拟”以备不时之需时,麻烦就开始了。

所以我用谷歌搜索了一下,阅读了《Go 中的实用持久性:组织数据库访问》一文,并尝试重构代码以使用正确的接口。

结果是这样的:

type Store {
    CreateA(a *A) error
    CreateB(a *A) error
}

type DB struct {
    orm.DB
}

func NewDBConnection(p *ConnParams) (*DB, error) {
    .... create db connection ...
    return &DB{db}, nil
}

func (db *DB) CreateA(a *A) error {
... …
Run Code Online (Sandbox Code Playgroud)

go go-pg

8
推荐指数
1
解决办法
4272
查看次数

Golang、postgresql、go-pg、UNION ALL 和 WITH

I\xe2\x80\x99m 使用 Golang、PostgreSQL 和 go-pg ( https://github.com/go-pg/pg )。

\n\n

我需要这个查询:

\n\n
WITH cte AS (\n    SELECT\n        "player"."id",\n        "player"."created_at",\n        "player"."note"\n    FROM\n        "players" AS "player"\n    ORDER BY\n        "amount" DESC,\n        "id"\n        LIMIT 5\n    ) ( SELECT * FROM cte ) UNION ALL\n    (\n    SELECT\n        "id",\n        "created_at",\n        CONCAT_WS ( \'|\', LAST_VALUE ( "created_at" ) OVER ( ), LAST_VALUE ( "id" ) OVER ( ) ) AS note\n    FROM\n        cte -- THIS IS CORRECT\n    LIMIT 1\n    )\n
Run Code Online (Sandbox Code Playgroud)\n\n

相反go-pg一直给我这个:

\n\n
WITH "cte" AS …
Run Code Online (Sandbox Code Playgroud)

sql postgresql union go go-pg

5
推荐指数
0
解决办法
948
查看次数

将数组传递给 go-pg 查询

我正在使用 Go-pg,当我使用以下方式执行 sql 查询时:

db.Query(&result, sqlQuery, params)
Run Code Online (Sandbox Code Playgroud)

params如下所示的结构在哪里:

type MyParams struct {
    Codes []int
}
Run Code Online (Sandbox Code Playgroud)

并且sqlQuery

SELECT id FROM bar WHERE code_id IN (?codes)
Run Code Online (Sandbox Code Playgroud)

在实际的 SQL 查询中,我得到这样的查询:

SELECT id FROM bar WHERE code_id IN ('[7,45]')
Run Code Online (Sandbox Code Playgroud)

是否可以正确传递 int 数组占位符以进行查询:

SELECT id FROM bar WHERE code_id IN (7,45)
Run Code Online (Sandbox Code Playgroud)

go go-pg

4
推荐指数
1
解决办法
3784
查看次数

与关系查询的关系

具有以下三个表,TableA,TableB,TableC 和一个连接表,定义如下:

type TableA struct {
   ID int
   Name string
   TableBs []*TableB  `pg:",many2many:table_a_table_b"`
 }
Run Code Online (Sandbox Code Playgroud)

type TableB struct{
  ID int
  Name string
  TableAID int
  TableA *TableA
  TableCID int
  TableC *TableC
}
Run Code Online (Sandbox Code Playgroud)

最后,

 type TableC struct {
   ID int
   Name string
  }
Run Code Online (Sandbox Code Playgroud)

table_a_table_b 是一个连接表,将表 A 和表 B 与多对多关系关联起来。

到目前为止一切顺利,我可以选择 TableA 中的数据,如下所示:

 pgdb := pg.Connect(......)
 tableA := []TableA{}
 
 pgd.Model(&tableA).Relation("TableBs").Select()
Run Code Online (Sandbox Code Playgroud)

然而,结果并不是我真正想要的。它导致这样的事情:

 [
  {
   "Id": 1
   "Name": "TestA record"
   "TableBs": [
      {
         "Id": 1,
         "Name": "TestB record",
         "TableAID": 1,
         "TableCID": 1, //Here, I want …
Run Code Online (Sandbox Code Playgroud)

go go-pg

1
推荐指数
1
解决办法
346
查看次数

处理动态查询(无法扫描到结构中)

当使用查询结构是静态的 go-pg 时 - 直接查询/扫描到已知结构中就像做梦一样。但是,我正在努力处理动态查询 - 没有结构可以扫描的查询。

例如,根据一些运行时参数 - 查询可能如下所示:

select foo from table
Run Code Online (Sandbox Code Playgroud)

或者它可能是

select foo,bar,baz from table1
Run Code Online (Sandbox Code Playgroud)

或者

select x,y,z from table2
Run Code Online (Sandbox Code Playgroud)

我一直在试图弄清楚如何使用将结果加载到地图中。下面的代码抛出错误“无效字符 '\' 寻找值的开头”

m := make(map[string]interface{})
_,err:=db.Query(&m, "select foo,bar from table1")
if err!=nil{
   fmt.Println(err)
}
Run Code Online (Sandbox Code Playgroud)

我刚刚开始学习围棋 - 我完全迷路了。关于如何处理动态查询的任何提示

go go-pg

0
推荐指数
1
解决办法
1627
查看次数

标签 统计

go ×5

go-pg ×5

postgresql ×1

sql ×1

union ×1