Mapping a subset DSL to SQL doesn’t sound too difficult since SQL already 
has those boolean expressions and such. The database/sql library uses 
context for cancellation, so queries that take too long could be cancelled 
by a timer goroutine.

One thing for me that would be helped by a library is keeping track of the 
argument placeholders ($1 $2 $3) and their indexing in the slice input to 
database/sql for the variadic part. Adding FOR UPDATE sometimes is also 
kind of ugly.

Here’s a case where I dynamically constructed a query: 
https://github.com/pciet/wichess/blob/master/game.go#L209

Matt

On Friday, March 2, 2018 at 12:38:23 PM UTC-6, Benjamin Thomas wrote:
>
> I believe correctly used database/sql (with the argument placeholders) 
>> protects against SQL injection
>>
>
> Yeah I badly explained this, an SQL builder solves security *AND* 
> flexibility for me. Standard database/sql placeholders are too painful when 
> the user params are too complex, and I can't just pass around SQL fragments.
>
> It sounds like you are reinventing SQL. Why do you need a DSL?
>>
>
> Yes, in a way SQL would be awesome, but way too powerful (and too 
> verbose). You can potentially access data from other tables, update/delete 
> data, etc.
>
> And how could you pass along raw SQL securely?
>
> I guess restricting data access could solve some issues. But let's say I'd 
> like to give access to a regex filter for some columns, but not others (for 
> performance reasons). Not sure if this would be possible at all via db 
> policies.
>
> I guess I'm looking for a "dumbed down" query language.
>
> In other words, as a programmer I've always been frustrated by search 
> forms I've developed. As a user, same thing, I always find them too 
> restrictive.
>
> I feel access to a DSL could be interesting for a power user, rather than 
> trying to anticipate every combination of search params a user would want 
> to perform. 
>
> Look at github for example, their advanced search form is interesting, and 
> love how readable the url can be: 
> https://github.com/search?q=language:Go+stars:<100+forks:>500
>
> However every params seems to be ANDed, so let's say you'd like to search 
> golang repos with less than 100 stars OR forks greater than 500, you can't 
> do it.
>
> Also if you pass invalid input, you seem to get garbage 
> : /search?q=language:whatever+stars:<100, so I feel that overall the user 
> experience is not that great.
>
> You see my point?
>  
>
> Le vendredi 2 mars 2018 15:11:19 UTC+1, matthe...@gmail.com a écrit :
>>
>> To prevent SQL injection and for flexibility, I'm set on using an sql 
>>> builder library.
>>
>>
>> I believe correctly used database/sql (with the argument placeholders) 
>> protects against SQL injection.
>>
>> There’s a query builder for postgres with MIT license posted here a few 
>> days ago: https://groups.google.com/forum/#!topic/golang-nuts/Mtqvr1N1zAI
>>
>> Otherwise strings.Builder (or bytes.Buffer pre-1.10), + string 
>> concatenation, or fmt.Sprintf can do it.
>>
>> ## First, create a solid CLI app. Then port it to the web via a JSON API, 
>>> that would simply consume the query string.
>>
>>
>> In Go this might be best done as a non-main package with a cmd folder 
>> that has a folder for the server and a folder for the CLI app.
>>
>> I'm thinking of implementing a lexer/parser for this, but first I'd like 
>>> to make sure I'm not going to reinvent the wheel :)
>>
>>
>> It sounds like you are reinventing SQL. Why do you need a DSL?
>>
>> Matt
>>
>> On Friday, March 2, 2018 at 7:45:19 AM UTC-6, Benjamin Thomas wrote:
>>>
>>> Hello gophers,
>>>
>>> Sorry if this is considered noise to some, as I have a question which is 
>>> not specifically go related.
>>>
>>> I have a personal project in which I'd like to use go though.
>>>
>>> Basically, I'd like to create a complex search form, returning data 
>>> backed by an SQL database.
>>>
>>> To prevent SQL injection and for flexibility, I'm set on using an sql 
>>> builder library.
>>>
>>> However I'm not sure how to go about querying the data itself, via query 
>>> params, without creating lots of boiler plate and duplication.
>>>
>>> I'm wondering if a solution similar to what I'm looking for exists, as 
>>> I've never stumbled upon one...
>>>  
>>> I'm submitting my thoughts below, and would greatly appreciate feedback 
>>> :)
>>>
>>> ===NOTES_START===
>>> # Idea for query params, for a search form.
>>>
>>> Upon UI changes, javascript would generate the appropriate final query 
>>> string
>>>
>>> A query string could be typed in by a power user, to handle cases not 
>>> covered by a simpler UI (via the url or text input)
>>>
>>> ## First, create a solid CLI app. Then port it to the web via a JSON 
>>> API, that would simply consume the query string.
>>>
>>> ```
>>> go run ./cmd/query/main.go QUERY_STRING
>>> ```
>>>
>>> ## Query string format would follow this principle
>>>
>>>     PARAM_NAME : VALUE : OPERATOR
>>>
>>> ```
>>> # Commands
>>> columns:posted_on,short_descr:eq
>>> columns:posted_on,short_descr:hide
>>> columns:posting_id,posted_on,short_descr:show
>>>
>>> limit:10:eq
>>> limit:10  # would default to `eq`?
>>>
>>> page:1
>>> page:2
>>> offset:20
>>>
>>> # Filtering
>>> euros:11.94 # would default to `eq`?
>>> euros:11.94:eq
>>> euros:100:lt
>>> euros:100:lte
>>>
>>> comment:FIXME # would default to `eq`?
>>> comment:FIXME:eq
>>> comment:NULL:eq
>>> comment:NULL:ne
>>> comment:%tickets%:like
>>> comment:%Tickets%:ilike
>>>
>>> payee:Amazon|Google:re # regex
>>> payee:AMAZON|Google:rei # regex, case insensitive
>>>
>>> ```
>>>
>>> ## Question: how would I chain commands? I cannot use & in urls.
>>>
>>> ### Maybe with a pipe char
>>>
>>>     QUERY_STRING | QUERY_STRING | QUERY_STRING
>>>
>>> ### Or via AND, OR keywords
>>>
>>> ```
>>>     qs=QUERY_STRING
>>>
>>>     qs AND qs OR qs
>>> ```
>>>
>>> ### Boolean logic, force the use of parentheses?
>>>
>>> ```
>>>     qs=QUERY_STRING
>>>
>>>     (qs AND qs) OR (qs OR qs)
>>> ```
>>> ===NOTES_END===
>>>
>>> Basically, I guess I'm looking for some kind of DSL.
>>>
>>> I'm thinking of implementing a lexer/parser for this, but first I'd like 
>>> to make sure I'm not going to reinvent the wheel :)
>>>
>>> Thanks for your interest and input!
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to