First of all, thanks for your response. 1. That makes more sense. 2. I use a select first, because there are actually more than 2 types of circuits, so there should be more models to be mapped to T_circirt. There are some models don't have vendor but need to be mapped to the consistent model T_Circuit, struct T_Circuit { 1. asset_id 2. vendor_id 3. vendor }
So what I did is first select from the original model(the other model other than transit, transport, but dc) and the use like: c3_select = select([ AssetDCCircuit.id, literal_column('NULL').label('vendor_id'), ]) And then map the T_Circiut to it: c3_mapper = mapper( TCircuit, c3_select, primary_key=[c3_select.c.id <http://c2_select.c.id/>], properties={ 'asset_id': c3_select.c.id <http://c2_select.c.id/>, 'vendor_id': c3_select.c.vendor_id, 'vendor': relationship( vendor_mapper, foreign_keys=[c3_select.c.vendor_id], ), ) The struct is a struct type of thrift service. Is there any way to resolve this avoiding the subquery? 3. T_Circuit is actully TT_Circuit, it's a typo. On Wednesday, October 26, 2016 at 10:12:38 AM UTC-7, Mike Bayer wrote: > > > > On 10/26/2016 12:03 PM, Alfred Soeng wrote: > > > > q1 > > = > session.query(c1.mapper._class).options(joinedload('vendor')).options(load_load('id')) > > > > q2 > > = > session.query(c2.mapper._class).options(joinedload('vendor')).options(load_load('id')) > > > > q1.union(q2).all() > > So there's some things to happen here: > > 1. Don't call "joinedload" on the Query that you're going to be putting > into a union. the "joinedload" is an option that attaches to the final > list of objects that you will be iterating. It doesn't make sense to > embed it inside of a SELECT that is going to be part a bigger statement. > > 2. setting up a mapper() of a select() is going to create more > subqueries and complicate things. The two selects you have don't > even seem to have any WHERE clause or anything, so I don't see why these > extra mappers are necessary. It would work a lot better just to map to > the underlying asset_transit_circuit and asset_transport_circuit tables > directly. All the mapper() calls here seem odd - classical mapping > is very seldom used and especially in conjunction with declarative, > there are very few reasons you'd want to do that. > > 3. while the information here gives me a few more clues, it's still not > enough for me to really see what you're doing. I don't see what > T_Vendor is (or how T_Vendor does anything that Vendor doesn't, why not > just "T_Vendor = Vendor" ?) , I don't see what TCircuit is (I see the > odd "struct" notation, but that's not Python - is TCircuit just an empty > class? Why is it mapped with mapper() and not a declarative class like > the others?) Overall there's a lot of odd patterns here that aren't > clear why they are necessary. > > Hopefully #1 is all you need here, though I'd want to clarify what the > rationale is for all the odd patterns because there is likely a much > simpler way to accomplish whatever it is. > > > > > > > > > > > > On Wednesday, October 26, 2016 at 3:42:51 AM UTC-7, Mike Bayer wrote: > > > > In a case like this I don't know what the problem is without being > able > > to run an example. The guidelines at > > http://stackoverflow.com/help/mcve > > <http://stackoverflow.com/help/mcve> would make this easiest. Can > > we see > > complete mappings / table information (only what's needed to > reproduce > > the problem) as well as how you are creating these Query and/or > > select() > > objects (it seems these are select() )? > > > > Also need version of SQLAlchemy in use. > > > > thanks! > > > > > > > > > > On 10/25/2016 04:48 PM, Alfred Soeng wrote: > > > When I union 2 queries, it seems combine the same relationship > > together > > > and cause the alias problem > > > In the code, it generated 2 queries like: > > > q1: > > > > > > SELECT anon_1.id <http://anon_1.id> AS anon_1_id, > anon_1.vendor_id > > AS anon_1_vendor_id, > > > vendor_1.id <http://vendor_1.id> AS vendor_1_id, vendor_1.name > > <http://vendor_1.name> AS vendor_1_name, > > > vendor_1.sf_id AS vendor_1_sf_id, vendor_1.transit_as_id AS > > > vendor_1_transit_as_id, vendor_1.created_by AS > vendor_1_created_by, > > > vendor_1.created_at AS vendor_1_created_at, vendor_1.updated_by AS > > > vendor_1_updated_by, vendor_1.updated_at AS vendor_1_updated_at, > > > vendor_1.active AS vendor_1_active > > > > > > FROM (SELECT asset_transport_circuit.id > > <http://asset_transport_circuit.id> AS id, > > > asset_transport_circuit.vendor_id AS vendor_id > > > > > > FROM asset_transport_circuit) AS anon_1 LEFT OUTER JOIN vendor AS > > > vendor_1 ON vendor_1.id <http://vendor_1.id> = anon_1.vendor_id > > > > > > > > > q2: > > > > > > SELECT anon_1.id <http://anon_1.id> AS anon_1_id, > anon_1.vendor_id > > AS anon_1_vendor_id, > > > vendor_1.id <http://vendor_1.id> AS vendor_1_id, vendor_1.name > > <http://vendor_1.name> AS vendor_1_name, > > > vendor_1.sf_id AS vendor_1_sf_id, vendor_1.transit_as_id AS > > > vendor_1_transit_as_id, vendor_1.created_by AS > vendor_1_created_by, > > > vendor_1.created_at AS vendor_1_created_at, vendor_1.updated_by AS > > > vendor_1_updated_by, vendor_1.updated_at AS vendor_1_updated_at, > > > vendor_1.active AS vendor_1_active > > > > > > FROM (SELECT asset_transit_circuit.id > > <http://asset_transit_circuit.id> AS id, > > > asset_transit_circuit.vendor_id AS vendor_id > > > > > > FROM asset_transit_circuit) AS anon_1 LEFT OUTER JOIN vendor AS > > vendor_1 > > > ON vendor_1.id <http://vendor_1.id> = anon_1.vendor_id > > > > > > > > > But when I called the q1.union(q2), it said an column issue > > because the > > > union merge the same 'LEFT OUTER JOIN vendor AS vendor_1 ON > > vendor_1.id <http://vendor_1.id> > > > = anon_1.vendor_id' together and cause a alias problem: > > > > > > > > > q1.union(q2): > > > > > > (1054, "Unknown column '`anon_2`.`vendor_id`' in 'on clause'") > [SQL: > > > 'SELECT anon_1.anon_2_id AS anon_1_anon_2_id, anon_2.vendor_id AS > > > anon_2_vendor_id, vendor_1.id <http://vendor_1.id> AS > vendor_1_id, > > vendor_1.name <http://vendor_1.name> AS > > > vendor_1_name, vendor_1.sf_id AS vendor_1_sf_id, > > vendor_1.transit_as_id > > > AS vendor_1_transit_as_id, vendor_1.created_by AS > > vendor_1_created_by, > > > vendor_1.created_at AS vendor_1_created_at, vendor_1.updated_by AS > > > vendor_1_updated_by, vendor_1.updated_at AS vendor_1_updated_at, > > > vendor_1.active AS vendor_1_active \nFROM (SELECT > > > asset_transport_circuit.id <http://asset_transport_circuit.id> AS > > id, asset_transport_circuit.vendor_id AS > > > vendor_id \nFROM asset_transport_circuit) AS anon_2, (SELECT /* > > > <string>:2 union --/--/--/-- */ anon_2.id <http://anon_2.id> AS > > anon_2_id \nFROM (SELECT > > > asset_transport_circuit.id <http://asset_transport_circuit.id> AS > > id, asset_transport_circuit.vendor_id AS > > > vendor_id \nFROM asset_transport_circuit) AS anon_2 \nWHERE > > anon_2.id <http://anon_2.id> IN > > > (%s, %s, %s) UNION SELECT anon_3.id <http://anon_3.id> AS > > anon_3_id \nFROM (SELECT > > > asset_transit_circuit.id <http://asset_transit_circuit.id> AS id, > > asset_transit_circuit.vendor_id AS > > > vendor_id \nFROM asset_transit_circuit) AS anon_3 \) AS anon_1 > LEFT > > > OUTER JOIN vendor AS vendor_1 ON vendor_1.id <http://vendor_1.id> > > = anon_2.vendor_id' > > > > > > > > > The 2 mappers are the same but different name: like below: > > > > > > > > > dc_select = > > > select([AssetTransportCircuit.id, > AssetTransportCircuit.vendor_id,]) > > > > > > > > > class TT_Circuit(object): > > > > > > def __init__(self, asset_id, vendor_id, vendor): > > > > > > self.asset_id = asset_id > > > > > > self.vendor_id = vendor_id > > > > > > self.vendor = vendor > > > > > > > > > circuit_mapper = mapper( > > > > > > TT_Circuit, > > > > > > dc_select, > > > > > > primary_key=[dc_select.c.id <http://dc_select.c.id>], > > > > > > properties={ > > > > > > 'asset_id': dc_select.c.id <http://dc_select.c.id>, > > > > > > 'vendor_id': dc_select.c.vendor_id.label('vendor_id'), > > > > > > 'vendor': relationship( > > > > > > vendor_mapper, > > > > > > primaryjoin=and_( > > > > > > dc_select.c.vendor_id == foreign(Vendor.id), > > > > > > foreign(Vendor.active), > > > > > > ), > > > > > > uselist=False, > > > > > > viewonly=True, > > > > > > ), > > > > > > } > > > > > > ) > > > > > > > > > Is there a way to resolve the problem? > > > > > > -- > > > SQLAlchemy - > > > The Python SQL Toolkit and Object Relational Mapper > > > > > > http://www.sqlalchemy.org/ > > > > > > To post example code, please provide an MCVE: Minimal, Complete, > and > > > Verifiable Example. See http://stackoverflow.com/help/mcve > > <http://stackoverflow.com/help/mcve> for a full > > > description. > > > --- > > > 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+...@googlegroups.com <javascript:> > > > <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:> > <javascript:>>. > > > To post to this group, send email to sqlal...@googlegroups.com > > <javascript:> > > > <mailto:sqlal...@googlegroups.com <javascript:>>. > > > Visit this group at https://groups.google.com/group/sqlalchemy > > <https://groups.google.com/group/sqlalchemy>. > > > For more options, visit https://groups.google.com/d/optout > > <https://groups.google.com/d/optout>. > > > > -- > > SQLAlchemy - > > The Python SQL Toolkit and Object Relational Mapper > > > > http://www.sqlalchemy.org/ > > > > To post example code, please provide an MCVE: Minimal, Complete, and > > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > > description. > > --- > > 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+...@googlegroups.com <javascript:> > > <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:>>. > > To post to this group, send email to sqlal...@googlegroups.com > <javascript:> > > <mailto:sqlal...@googlegroups.com <javascript:>>. > > Visit this group at https://groups.google.com/group/sqlalchemy. > > For more options, visit https://groups.google.com/d/optout. > -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- 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 https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.