Thank you for this very instructive answer!  As I've never really used 
anything else than MySQL, I didn't know this.  But as you said, there 
should probably be a note about this in the documentation, at least to 
define what "affected" means in the context of SQLAlchemy.

On Tuesday, June 12, 2012 10:49:53 AM UTC-4, Michael Bayer wrote:
>
>
> On Jun 12, 2012, at 7:07 AM, Francis wrote:
>
> I posted this on StackOverflow:
>
> We have a MySQL database and we're switching from DB API to SQLAlchemy. 
>> From the documentation, the ResultProxy.rowcount is supposed to report the 
>> number of affected rows by an UPDATE statement.
>> If I execute this query with SQLAlchemy:
>> UPDATE table
>> SET field =
>> IF(field < 10, 10, field) WHERE id = 1
>> It will return a rowcount of 1 if there's a matching row, but for any 
>> value of "field" (even when greater or equal than 10). When I executed this 
>> query with DB API, it returned the correct number of affected rows (0 when 
>> field was greater or equal than 10 and 1 if lower).
>> That's causing us some troubles because we'll have to first execute a 
>> select query to determine if there was a change or not. Is it a bug in 
>> SQLAlchemy? The documentation clearly states that if should return the 
>> number of affected rows, not the number of matching rows.
>
>
> I got an answer saying that if CLIENT_FOUND_ROWS is set, the number of 
> affected rows becomes the number of matching rows.  I've checked and 
> SQLAlchemy sets this flag.  This is clearly in contradiction with the 
> documentation, so I think that it's a bug that should be fixed.
>
>
> First off, let's note the new documentation which reorganizes the many 
> misunderstandings this attribute has caused over the years, and now 
> includes a removal of the word "affected":
>
>
> http://docs.sqlalchemy.org/en/rel_0_7/core/connections.html#sqlalchemy.engine.base.ResultProxy.rowcount
>
> MySQL-specific notes are also added at:
>
> http://docs.sqlalchemy.org/en/rel_0_7/dialects/mysql.html#rowcount-support
>
> these new notes are in versions 0.6, 0.7, 0.8.
>
> Next, here's why "affected" is not clearly a contradiction based on where 
> you're coming from.
>
> The DBAPI spec says this:
>
>            This read-only attribute specifies the number of rows that
>            the last .execute*() produced (for DQL statements like
>            'select') or affected (for DML statements like 'update' or
>            'insert').
>
> First note that the rowcount on "select" is not something anyone uses 
> consistently since this is not a common feature of database client 
> libraries.
>
> For UPDATE and DELETE, someone familiar with a wide array of databases 
> would read this paragraph and link it to the knowledge they have of what 
> database client libraries usually offer in this regard.   The client APIs 
> of: SQLite, Postgresql, Oracle, Sybase, Microsoft SQL Server, Firebird, and 
> all the rest of them, *except* for MySQL, consider the "rowcount" to be the 
> number of rows *matched* by the WHERE criterion.   So most people who read 
> this paragraph link it to a broader field of knowledge about client APIs 
> and based on established convention know that "affected" here means "number 
> of rows matched", where MySQL is, as they so often are, the one backend 
> that re-interprets the meaning/behavior of standard features to be 
> something different (but as always, with flags/switches added at some point 
> to make it act the "normal" way).
>
> It was in this way that the word "affected" found its way directly in the 
> SQLAlchemy docs for rowcount.   However, taking the word "affected" 
> literally without the benefit of context, yes this is totally unclear.   
> I've emailed DB-SIG to get their thoughts on if/how they'd like to clarify 
> this.
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sqlalchemy/-/M7PyI_DGh0oJ.
To post to this group, send email to sqlalchemy@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.

Reply via email to