Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #69276 > unrolled thread

Re: Using query parameters subtitution outside of execute()

Started byPeter Otten <__peter__@web.de>
First post2014-03-28 14:53 +0100
Last post2014-03-28 14:53 +0100
Articles 1 — 1 participant

Back to article view | Back to comp.lang.python

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  Re: Using query parameters subtitution outside of execute() Peter Otten <__peter__@web.de> - 2014-03-28 14:53 +0100

#69276 — Re: Using query parameters subtitution outside of execute()

FromPeter Otten <__peter__@web.de>
Date2014-03-28 14:53 +0100
SubjectRe: Using query parameters subtitution outside of execute()
Message-ID<mailman.8669.1396014805.18130.python-list@python.org>
Daniele Forghieri wrote:

> Il 28/03/2014 10:16, Peter Otten ha scritto:
>> Daniele Forghieri wrote:
>>
>>> Hi to all. I'm using sqlite3 with python 2.7 on windows.
>>>
>>> I use the query substitution parameters in my query but I need to pass
>>> part of the query to a function, something like (it's not the real
>>> examples, just to clarify the question):
>>>
>>> def loadAll(cursor, id, queryAdd = None):
>>>       if queryAdd is None:
>>>           qry =  'select * from files where catalog = ?'
>>>       else:
>>>           qry = 'select * from files where catalog = ? and %s' %
>>>           (queryAdd))
>>>
>>>       cursor.execute(qry, (id, ))
>>>       ...
>>>
>>> I would like to use the query substitution even when I create, in
>>> another piece of code, the queryAdd part, something like:
>>>
>>> queryAdd = cursor.querySubst('enabled = ? and hide = ? and data > ?',
>>> (enabled, hidden, min_date, ))
>>>
>>> when the function take care of the date format, quoting the parameter
>>> and so on
>>>
>>> It's possible or not ?
>> You can use named parameters
>>
>> http://docs.python.org/dev/library/sqlite3.html#cursor-objects
>>
>> Your function might become (untested)
>>
>> def load_all(cursor, parameters, condition="catalog = :id"):
>>      query =  'select * from files where ' + condition
>>      cursor.execute(query, parameters)
>>      ...
>>
>> load_all(
>>      cursor, dict(id=42, fromdate=datetime.date.today()),
>>      condition="catalog = :id and date >= :fromdate")
>>
> 
>      Thank. With this I can solve the problem but I have to specify the
> query twice and if I have to change something I need to made it
> everywhere I use the function and is something I would like to avoid.

How about that one:

def query_subst(sql, parameters):
    return sql, parameters

def load_all(cursor, id, query_add=None):
    query =  'select * from files where catalog = ?'
    parameters = (id,)
    if query_add is not None:
        query += " and " + query_add[0]
        parameters += query_add[1]
    cursor.execute(query, parameters)
    ...

enabled = True
hidden = False
min_date = datetime.date.today()

query_add = query_subst(
    'enabled = ? and hide = ? and date > ?', 
    (enabled, hidden, min_date))

load_all(cs, 42, query_add)

>      I also don't like very mush to pass or create a dict for a function
> call but that's probably me coming from old plain C ;)

Get over it ;)

[toc] | [standalone]


Back to top | Article view | comp.lang.python


csiph-web