On Dec 22, 2008, at 11:06 AM, Eoghan Murray wrote:
>
> The following example uses an elixir class:
>
> class MyE(Entity):
> id = Field(Integer, primary_key=True)
> f_1 = ManyToOne('OtherE')
> f_2 = ManyToOne('OtherE')
> date = Field(Date)
>
> MyE.query.select_from(union(MyE.table.select(),
> select([MyE.id, MyE.f_1.label('f_2'),
> MyE.f_2.label('f_1')]))).\
> order_by([MyE.date])
It would help if you could illustrate with accurate code - the UNION
above does not have consistent numbers of columns in each select() and
I think what you're trying to do is reverse f_1 and f_2 in the second
select() statement which is also not illustrated above.
I am able to reproduce your results with the script at the end of this
email.
Its a fun little problem for which I haven't thought of a solution as
of yet. your union delivers both f_1 and f_2 from its second and
third columns. If you ask the union, hey which one of your columns
corresponds to table.c.f_1 , the answer is ambiguous since its both.
I could change corresponding_column to raise an error for this
ambiguity, but that wouldnt fix your problem. The thing you "expect"
here is that the columns in the *first* select of the union should
take precedence over the subsequent ones. A naive change in that
regard breaks tests which do in fact place columns in subsequent
selects which need to be counted so something else will have to be
figured out. probably some extra guesswork in
CompoundSelect._populate_column_collection to detect this kind of thing.
Why do all the really intricate problems seem to come from the elixir
camp ? :)
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite://', echo=True)
Base = declarative_base()
class Other(Base):
__tablename__ = 'other'
id = Column(Integer, primary_key=True)
class MyE(Base):
__tablename__ = 'mine'
id = Column(Integer, primary_key=True)
f_1 = Column(Integer, ForeignKey('other.id'))
f_2 = Column(Integer, ForeignKey('other.id'))
foreign_1 = relation(Other, primaryjoin=f_1==Other.id)
foreign_2 = relation(Other, primaryjoin=f_2==Other.id)
date = Column(Date)
Base.metadata.create_all(engine)
sess = sessionmaker(bind=engine)()
u = union(
MyE.__table__.select(),
select([MyE.id, MyE.f_2, MyE.f_1, MyE.date])
)
# this is why
print ua.corresponding_column(MyE.__table__.c.f_1)
print ua.corresponding_column(MyE.__table__.c.f_2)
print sess.query(MyE).select_from(u).order_by(MyE.date).all()
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---