jjzjj

arrays - 如何将 JOIN 映射到具有子结构数组的结构数组

coder 2024-07-10 原文

我的数据库中有两个表,tagsrecord_tag:

tags
----
id
name

record_tag
----------
id
record_id
tag_id
...
tag_owner (user_id)

我有这两个结构:

type Tag struct {
    Id          int    `json:"id" db:"id"`
    Tag_owner   string `json:"tag_owner" db:"tag_owner"`
    Tag_id      int    `json:"tag_id" db:"tag_id"`
    Record_id   string `json:"record_id" db:"record_id"`
    Record_type string `json:"record_type" db:"record_type"`
    Record_kind string `json:"record_kind" db:"record_kind"`
    Text        string `json:"text" db:"name"`
    Meta        string `json:"meta" db:"meta"`
}

type TaggedRecord struct {
    Record_id string `json:"record_id" db:"record_id"`
    Tags      []Tag  `json:"tags" db:"tag_id"`
}

目前,我有这个执行 n sqlx 的循环调用:

taggedRecords := []TaggedRecord{}
for _, record := range body.Records {
    tags := []Tag{}
    _ = db.Select(&tags, "SELECT r.id,r.tag_owner,r.record_id,r.tag_id,r.record_type,r.meta,r.record_kind,t.name FROM record_tag r, tags t WHERE r.tag_owner = $1 AND r.record_id = $2 AND r.tag_id = t.id", body.User, record)
    taggedRecord := TaggedRecord{Record_id: record, Tags: tags}
    taggedRecords = append(taggedRecords, taggedRecord)
}

当我将 taggedRecords 编码为 JSON 时,我得到了所需的输出:

[
  {
    "record_id": "dfwref3f",
    "tags": []
  },
  {
    "record_id": "3lkgekrljdkjfkjekjkjker",
    "tags": [
      {
        "id": 6,
        "tag_owner": "p0stman",
        "tag_id": 2,
        "record_id": "3lkgekrljdkjfkjekjkjker",
        "record_type": "candidate",
        "record_kind": "candidate",
        "text": "lol",
        "meta": "{\"name\": \"exxon mobile\"}"
      },
      {
        "id": 7,
        "tag_owner": "p0stman",
        "tag_id": 3,
        "record_id": "3lkgekrljdkjfkjekjkjker",
        "record_type": "candidate",
        "record_kind": "candidate",
        "text": "df",
        "meta": "{\"name\": \"exxon mobile\"}"
      }
    ]
  }
]

显然,这是虚拟数据。上面的实现有效,但我不喜欢这样,因为通常 n 为 10,这是对数据库的 10 个单独网络调用。我四处寻找并尝试了一些东西。我觉得应该可以将其作为一个查询。我试过实现 this解决方案,但它对我不起作用,因为我的根结构嵌入了子结构的数组,而不仅仅是一个子结构。

我试过这个:

taggedRecords := []TaggedRecord{}
var s string
for _, record := range body.Records {
    s = s + "r.record_id = '" + record + "' OR "
}
s = s[:len(s)-4]

_ := db.Select(&taggedRecords, "SELECT r.id,r.tag_owner,r.record_id,r.tag_id,r.record_type,r.meta,r.record_kind,t.name,t.id FROM record_tag r, tags t WHERE r.tag_owner = $1 AND "+s+" AND r.tag_id = t.id", body.User)

Select 吐出一个错误,说找不到目标名称 id,我假设这是因为它有两个 id 字段,它不能正确地将连接映射到两个结构( db 语法似乎不支持点来表示表名或昵称)或两者的混合。

在减少数据库调用的同时实现此 SQL 调用并编码为上述输出格式的最佳方法是什么?

最佳答案

你可以使用IN表达式来选择一堆tags whole sale 然后 在 Go 中将它们分配给各自的所有者。

  WHERE some_id IN(1,2,3,4)

您可以遍历一组 id 来构建它

或者您可以通过使用 SQL 别名来避免歧义查询

 SELECT t.id , r.id as r_id 

并在 Go 中以多种方式区分这些列(将列添加到结构中,使用 sqlx 结构标记 ...)

关于arrays - 如何将 JOIN 映射到具有子结构数组的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37999685/

有关arrays - 如何将 JOIN 映射到具有子结构数组的结构数组的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  6. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  7. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  8. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  9. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  10. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

随机推荐