【问题标题】:How to run a Datastore GQL query in Golang?如何在 Golang 中运行 Datastore GQL 查询?
【发布时间】:2017-04-30 15:09:34
【问题描述】:

我在 GQL 中有以下查询:

"SELECT * FROM Task WHERE Uuid = \"FOOBAR\" ORDER BY CreateTimeMs DESC LIMIT 1"

如何在 Golang 中直接运行此查询?

query := datastore.NewQuery("SELECT * FROM Task WHERE Uuid = \"FOOBAR\" ORDER BY CreateTimeMs DESC LIMIT 1") 似乎不正确。

更新:
我非常了解Query types。问题是我想直接使用 GQL 而不是将它们转换为查询类型。

【问题讨论】:

  • 你得到什么错误?或者你有什么其他证据证明它是不正确的?
  • 不能使用"SELECT * FROM Task WHERE Uuid = \"foobar\" ORDER BY CreateTimeMs DESC LIMIT 1" (type string) as type *"cloud.google.com/go/datastore".Query in argument to client.Run。这是有道理的,更重要的是,我不知道要为 GQL 查询使用哪个函数...

标签: go google-cloud-datastore gql


【解决方案1】:

当我在GQL documentation 中看到此注释时,我正在寻找解决完全相同的问题:

注意: Google Cloud Client Library for Java 和 Google Cloud Client Library for Ruby 支持 GQL,但其他 Google Cloud 客户端库不支持。

所以这是不行的......

但是,通过REST api projects.runQuery 实现它应该是可行的,但是您必须自己将结果解组为结构。

【讨论】:

  • 感谢维姆提供的信息
【解决方案2】:

看看Query 类型的文档,通过查看它的方法并阅读它们各自的文档,您应该能够了解如何将您的SQL 转换为datastore.Query 特定的方法调用。

比如你的sql可以写成:

q := datastore.NewQuery("Task").Filter("Uuid =", "FOOBAR").Order("-CreateTimeMs").Limit(1)

这只是构建您的 Query 值,要获得实际结果,您需要 run 查询以获取 iterator,其 Next method 可用于读取结果。

如果你想避免 run-iterate-next dance 你可以使用GetAll 查询方法。

var tt = []*Task{}
q := datastore.NewQuery("Task").Filter("Uuid =", "FOOBAR").Order("-CreateTimeMs").Limit(1)
if _, err := q.GetAll(tt); err != nil {
    panic(err)
}
log.Println(tt[0]) // your task

在这里阅读更多:

【讨论】:

  • 谢谢@mkoprive,我知道这一点。问题是,我有一堆想要直接运行的 GQL 查询。但是,我会接受这个答案,因为无论出于何种原因,友好的 Go 社区已经开始反对这个问题。
  • 对不起,我完全误解了你的问题。我进行了快速搜索,在我看来,您被 Query 类型困住了,我在 appengine 的 Go 特定文档中的 GQL 上找不到任何内容。
  • 不用担心,谢谢。不过,对 0 的赞成票将不胜感激:-)
  • 你去吧,只是为了清楚不是我投了反对票;)。
  • 哦,哎呀,哈哈。不过谢谢;-)
猜你喜欢
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2018-09-26
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2016-02-10
相关资源
最近更新 更多