4

I have the following query in GQL:

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

How can I directly run this query in Golang?

query := datastore.NewQuery("SELECT * FROM Task WHERE Uuid = \"FOOBAR\" ORDER BY CreateTimeMs DESC LIMIT 1") seems to be incorrect.

UPDATE:
I am very aware of the Query types. The thing is that I would like to use GQL directly instead of translating them into Query types.

Bob van Luijt
  • 7,153
  • 12
  • 58
  • 101
  • What error do you get? Or what other evidence do you have that it's incorrect? – Jonathan Hall Apr 30 '17 at 15:13
  • cannot use `"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`. This makes sense, the point is more, that I don't know which function to use for GQL queries... – Bob van Luijt Apr 30 '17 at 15:21

2 Answers2

1

I was searching to solve exactly the same problem when I came across this note in the GQL documentation:

Note: Google Cloud Client Library for Java and Google Cloud Client Library for Ruby support GQL, but other Google Cloud client libraries do not.

So that's a no-go ...

However, it should be feasible to implement it over the REST api projects.runQuery but then you have to unmarshal the result into structs by yourself.

0

Take a look at the Query type documentation, from looking at its methods and reading their respective documentation you should be able to understand how to translate your SQL into datastore.Query specific method calls.

For example your sql can be written as:

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

This just builds your Query value, to get the actual result you need to run the query to get an iterator whose Next method can be used to read the result.

If you want to avoid the run-iterate-next dance you can use the GetAll query method.

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

Read more here:

mkopriva
  • 35,176
  • 4
  • 57
  • 71
  • Thanks @mkoprive, I'm aware of this. The thing is, I have a bunch of GQL queries that I would like to run directly. But, I will accept this answer because for whatever reason the friendly Go community already started downvoting this question. – Bob van Luijt May 02 '17 at 07:36
  • I'm sorry I've totally misunderstood your question. I did a quick search and it seems to me that you're stuck with the `Query` type, I can't find anything on `GQL` in the Go specific documentation on appengine. – mkopriva May 02 '17 at 08:23
  • No worries, thanks. An upvote to 0 would be appreciated though :-) – Bob van Luijt May 02 '17 at 11:31
  • 1
    There you go, just to be clear it wasn't me who downvoted ;). – mkopriva May 02 '17 at 11:33
  • o, oops, haha. Thanks though ;-) – Bob van Luijt May 02 '17 at 20:56