I see. Greatly appreciated. SA is amazing. On May 20, 9:09 am, Conor <conor.edward.da...@gmail.com> wrote: > On 05/20/2010 10:53 AM, Bryan wrote: > > > Including the expressing in the values() clause w/ a bindparam like in > > your second example did the trick. I haven't checked the MySQL logs > > if I loose the executemany() benefits (not sure off the top of my head > > how the MySQL logs would show those benefits), but at least my tests > > are passing now. > > > I'm curious, isn't this still better than looping through all the > > updates I need to do and building an update object for each row? > > MySQL may see the same amount of unique UPDATE queries either way, but > > at least SA only needs to create one update object when using > > bindparams and a list of values. > > The performance advantage of executemany is that the DBAPI client only > needs to send one UPDATE statement to the server along with a bunch of > values instead of a bunch of UPDATE statements. So you only pay the > parsing/planning/network latency penalty once. > > The cost of SQLAlchemy generating update objects and compiling them to > SQL is generally negligible compared to the cost of actually executing > them. If all your updates are of the form "col1=<constant>, col2=col1 * > <constant>", then by all means use executemany. I had just figured that > you wanted some rows to use col2=<constant> while other rows used > col2=col1 * <constant>, which is not supported by a single executemany > statement. > > -Conor > > > > > My actual code doesn't modify the update object in place, sorry about > > the typo. > > > On May 20, 8:41 am, Conor <conor.edward.da...@gmail.com> wrote: > > >> On 05/20/2010 10:28 AM, Bryan wrote: > > >>> How about some sort of literal: "table1.col1 * 5" (without the quotes) > >>> as the value of a bindparam? So to the bindparam it would look like a > >>> constant, but when it got to the server, it would be interpreted as an > >>> expression? I would be loosing the automatic table/column name > >>> insertion that SA provides. > > >> Bind params don't work like that: you just cannot inject arbitrary SQL > >> via bind params. You have to include the expression as part of the > >> update statement itself. The only downside to this approach is you (may) > >> lose the executemany() behavior you may have been looking for > >> (executemany is when you pass an array of bind params to execute): > > >> u = table1.update() > >> u = u.values(col1=5, col2=table1.c.col1 * 5) > >> engine.execute(u) > > >> If you really need bind params, the best you can do is this, which is > >> probably not what you want: > > >> u = table1.update() > >> u = u.values(col1=bindparam('_col1'), col2=table1.c.col1 * > >> bindparam('_col2')) > >> engine.execute(u, [{'_col1': 5, '_col2': 5}]) > > >> I also just noticed that your original example: > > >> u = table1.update() > >> u.values(col1=bindparam('_col1'), col2=bindparam('_col2') ... > > >> tried to modify the update object in place, but the values() method > >> returns a new update object instead of modifying the original. > > >> -Conor > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group > athttp://groups.google.com/group/sqlalchemy?hl=en.
-- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.