Hi Mariano, I tried your code and it worked great. Now I have to look a way of linking the "union" query with a mapper to obtain a rather elaborate object than a raw tuple, I mean, when you execute: q = session.query(Computer).all() you get Computer objects, but when you execute the "union" query you get tuples. When looking at the resulting tuples, I noticed that those tuples that represent Computer objects contains a field equal to "None" due to the extra column added in the query. I guess that field could be used somehow to distinguish between Computer-like tuples and CompSetComputer-like ones. I'm telling you this b/c I would like to know if there is a mechanism to link a method to a mapper. This way, the method would process the "union" query, and would create a list of Computer and CompSetComputer objects. Do I make myself clear? Thanks for your help, Sandor
PS: this is the code I tried. I made some modifications, but it's the same as yours. #------------------------------------------------------------------------------------------------------------------------------------------ from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, select, union_all, schema from sqlalchemy.orm import mapper, sessionmaker from sqlalchemy.sql.expression import null # Engine & Session engine = create_engine('sqlite:///:memory:', echo=False) # set to True if you want to activate logging Session = sessionmaker(bind=engine) # Current session session = Session() # Metadata & Tables & Mappers metadata = MetaData() # Tables comp_table = Table('comp', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('description', String), Column('ip', String), # This table has many-to-many relation with the rules table, # so I don't have a rule_id here, instead I have # a table rule_computers_table to store rule_ids and computer_ids, # you know :) # I included it in my messy-model to specify a relation but it is not # actually present in the table definition. I appologize. # That's why I'm including my code, to clarify my situation. ) compset_comp_table = Table('compset_comp', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('description', String), Column('ip', String), Column('compset_id', Integer), # This is actually a ForeinKey to the Computer_set table ) # (...) # Classes class Computer(object): pass class CompSetComputer(object): pass # Mappers mapper(Computer, comp_table) mapper(CompSetComputer, compset_comp_table) # Create the tables metadata.create_all(engine) # Testing... # Insert c = Computer() c.name = "comp-1" c.ip = "1.2.3.4" c.description = "test comp 1" session.add(c) c = Computer() c.name = "comp-2" c.ip = "10.20.30.40" c.description = "test comp 2" session.add(c) csc = CompSetComputer() csc.name = "csc-1" csc.ip = "11.22.33.44" csc.description = "test compset-comp 1" csc.compset_id = "12" session.add(csc) csc = CompSetComputer() csc.name = "csc-2" csc.ip = "101.202.303.404" # invalid ip address, i know, it's just for testing :) csc.description = "test compset-comp 2" csc.compset_id = "91" session.add(csc) session.commit() # Multi-select q1 = session.query(Computer.id, Computer.name, Computer.description, Computer.ip, null()) q2 = session.query(CompSetComputer.id, CompSetComputer.name, CompSetComputer.description, CompSetComputer.ip, CompSetComputer.compset_id) q = q2.union(q1) print 80*"-", print q print 80*"-" for x in q: print x # Clean up session.close() # ------------------------------------------------------------------------------------------------------------------------------------------ -- 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.