On 5/15/15 9:56 AM, Antoine Leclair wrote:
Hi all,

I recently tried to update SQLAlchemy from 0.9.4 to 1.0.4 in a client's project. However, I run into an error that is not there with 0.9.4.

It happens for this type of query:

    q = DBSession.query(User) \
 .filter(User.profile_id.in_(profile_ids)) \
 .join(Profile)
    q = q.outerjoin(
        CouplePhoto,
        and_(
User.profile_id==CouplePhoto.profile_id,
CouplePhoto.avatar==True
        )
    )
    q = q.with_entities(User.profile_id, User.given_name, User.zipcode,
  CouplePhoto.filename, User.gender, Profile.sex)
    users_data = q.all()
for u in users_data:
        if u.filename:
*# the next line causes the error in 1.0.4*
*u.filename = 'something'*

In 0.9.4, the type of "u" was "KeyedTuple" and in 1.0.4, it's "result". The error is "AttributeError: can't set attribute".

The goal of this assignation is to recompute the filename according to the original filename (to show a thumb instead of original). It is not saved in the database.

Now, I know this is not necessarily good design and I would not have done it that way myself. But the code base is probably full of this type of thing, mixed with business logic, and trying to fix them is clearly not doable in the short term.
let's look at the behavior of Python's own "namedtuple":

>>> import collections
>>> my_tuple = collections.namedtuple('x', ['a', 'b'])
>>> rec = my_tuple(1, 2)

as we can see, assigning to a tuple is not allowed:

>>> rec.a = 5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

additionally, the tuple doesn't allow any other attributes to be set either; this is actually not working in 1.0.4's version of the tuple but we just fixed this for 1.0.5:

>>> rec.c = 7
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'x' object has no attribute 'c'

So unfortunately your code is doing something that never should have been allowed.


And we have to update SQLAlchemy, because some circular reference issue was fixed when using Alembic somewhere between 0.9.4 and 1.0.4.
SQLAlchemy's releases are parallel, where we support multiple X.Y series at the same time for a short period. In this case, the 0.9 series is separate and is in maintenance mode. The reason these parallel releases exist is exactly so that existing applications can take all the time they need, in some cases years, to upgrade their applications to the newer major version (see the bottom of http://www.sqlalchemy.org/download.html to get a feel for this). So there is no reason for you to be using the 1.0 series, stay with the 0.9 series (currently at 0.9.9) until you have the opportunity to upgrade your development tree to the 1.0 series. I'm not familiar with the bug you refer to but critical Python-level bugs are typically backported and I'm sure that if this is a documented bug fixed since 0.9.4, it's in the 0.9 series.

--
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.

Reply via email to