On Saturday, April 26, 2014 9:12:22 PM UTC+1, Michael Bayer wrote: > > On Apr 26, 2014, at 3:26 PM, Tim Kersten <t...@io41.com <javascript:>> > wrote: > > > The resulting behaviour would be identical to using a version col id, > but only for this transaction and the instance passed to the update_where() > method, and instead of "UPDATE ... WHERE <pk> = %s AND version = %s" you'd > have "UPDATE ... WHERE <pk> = %s AND name = %s”. > > This is where it would have to go: > > > https://bitbucket.org/zzzeek/sqlalchemy/src/146fbf6d26a8c4140a47aeb03131fdf81007b9a2/lib/sqlalchemy/orm/persistence.py?at=master#cl-308
Cool, thanks. > > > where you can see that logic is wired to a single “expression”, which > could be a SQL expression that gathers up lots of columns, but the > expression is fixed. It isn’t derivable from all the attributes that have > “changed”, and the logic here would need to be expanded into a much more > elaborate, complicated, and non-performant system to support this case. > For a feature to be added, it must attain a certain ratio of “impact on > complexity” to “how many people will actually use it”. If the feature is > very simple and non-intrusive, we can often add it even if only one person > needs it. If the feature is very complex, we can add it only if this is an > obvious need by a significant percentage of users. > > in many cases we add event hooks in areas that are to allow expansion of > capabilities, but in the case of “persistence”, we already have > before_update() and after_update(), adding more hooks into the construction > of the actual SQL would be very complex and extremely specific to the > mechanics; it would be brittle, unstable and difficult to use. > > IMHO the two existing approaches have no downsides: > > 1. repeatable read isolation (which can be set on a per-session or > per-transaction basis. Why not just use it?) > Are you saying there's a way to use the ORM with repeatable read isolation without potentially overwriting another user's changes? I'm not sure how (other than using version col id, in which case I don't need to use repeatable read isolation). > > 2. version columns, including version columns that can be *timestamps*. > There is no need to go through an expensive (think TEXT/BLOB columns) and > error prone (think floating points) comparison of every column if the > UPDATE of a stale row is to be avoided - “stale” just means “our timestamp > of the row is earlier than the timestamp that’s present”. > Timestamps are only so granular though (depending on the database used) - two updates in very close succession may have the same timestamp set, so while it's unlikely to lead to data loss, it cannot guarantee it like a plain counter version column would. > > > Advantages of using the above approach instead of version col id: > > - Much finer grain changes possible without raising an exception, > > The behavior where version misses are to be ignored is also quite unusual > and I’ve never known anyone to want silent failure of an UPDATE statement > like that. An entity update has a specific intent which is to target that > entity; this is at the core of what an ORM is trying to do. > You're right, an ORM is meant to target a specific entity. Whether the failure is silent or not doesn't play much role, in fact as you pointed out earlier it makes a lot of sense in an ORM for a failed update to raise an exception. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.