Anand, what do you think of

1) my response here (re having a separate function)?
2) do you think this would be a good addition to web.py proper, and do you
want a patch for that?

-Ben


On Thu, Mar 28, 2013 at 3:52 PM, Ben Hoyt <benh...@gmail.com> wrote:

> No, I don't think so, because values needs to be a list of dicts too, and
> db.update() takes its values as keyword args.
>
> Also, I guess I don't love APIs with too much overloading for
> substantially different functionality.
>
> -Ben
>
>
> On Thu, Mar 28, 2013 at 3:46 PM, Anand Chitipothu <anandol...@gmail.com>wrote:
>
>> Nice!
>>
>> Why do we need a different function? Can't the same update function
>> handle this when vars is a list instead of a dict?
>>
>> Anand
>>
>>
>> On Thursday, March 28, 2013, Ben Hoyt wrote:
>>
>>> Okay, so I was definitely doing the unicode and joining wrong. New
>>> version below. I *think* this is correct. (It definitely works now, at
>>> least.)
>>>
>>> -----
>>> def multiple_update(table, where, values_vars, database=None,
>>> _test=False):
>>>     r"""Execute multiple separate update statements in one query.
>>>
>>>     >>> database = web.DB(None, {})
>>>     >>> row1 = ({'name': 'Bob'}, {'id': 42})
>>>     >>> row2 = ({'name': 'Sarah', 'age': 30}, {'id': 23})
>>>     >>> query = multiple_update('foo', 'id = $id', [row1, row2],
>>> _test=True, database=database)
>>>     >>> query
>>>     <sql: "UPDATE foo SET name = 'Bob' WHERE id = 42;\nUPDATE foo SET
>>> age = 30, name = 'Sarah' WHERE id = 23">
>>>     >>> query.query()
>>>     'UPDATE foo SET name = %s WHERE id = %s;\nUPDATE foo SET age = %s,
>>> name = %s WHERE id = %s'
>>>     >>> query.values()
>>>     ['Bob', 42, 30, 'Sarah', 23]
>>>
>>>     >>> query = multiple_update('bar', 'a = $b', [({'c':
>>> decimal.Decimal(2)}, {'b': 3})], _test=True, database=database)
>>>     >>> query
>>>      <sql: "UPDATE bar SET c = Decimal('2') WHERE a = 3">
>>>     >>> query.query()
>>>     'UPDATE bar SET c = %s WHERE a = %s'
>>>     >>> query.values()
>>>     [Decimal('2'), 3]
>>>
>>>     >> print multiple_update('foo', 'id = $id', [], _test=True,
>>> database=database)
>>>     None
>>>
>>>     """
>>>     if not values_vars:
>>>         return
>>>     if database is None:
>>>         database = dbconn.db_connection
>>>
>>>     updates = []
>>>     for values, vars in values_vars:
>>>         updates.append(
>>>             'UPDATE ' + table +
>>>             ' SET ' + web.db.sqlwhere(values, ', ') +
>>>             ' WHERE ' + database._where(where, vars)
>>>         )
>>>
>>>     query = web.SQLQuery.join(updates, sep=';\n')
>>>     if _test:
>>>         return query
>>>     database.query(query)
>>> -----
>>>
>>> -Ben
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "web.py" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to webpy+unsubscr...@googlegroups.com.
>>>
>>> To post to this group, send email to webpy@googlegroups.com.
>>> Visit this group at http://groups.google.com/group/webpy?hl=en.
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>>
>>>
>>
>>
>> --
>> Anand
>> http://anandology.com/
>>
>>  --
>> You received this message because you are subscribed to a topic in the
>> Google Groups "web.py" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/webpy/dTeS_5Vm7BM/unsubscribe?hl=en.
>> To unsubscribe from this group and all its topics, send an email to
>> webpy+unsubscr...@googlegroups.com.
>> To post to this group, send email to webpy@googlegroups.com.
>> Visit this group at http://groups.google.com/group/webpy?hl=en.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"web.py" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to webpy+unsubscr...@googlegroups.com.
To post to this group, send email to webpy@googlegroups.com.
Visit this group at http://groups.google.com/group/webpy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to