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 [email protected] <javascript:>
> > > <mailto:[email protected] <javascript:>
> <javascript:>>.
> > > To post to this group, send email to [email protected]
> > <javascript:>
> > > <mailto:[email protected] <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 [email protected] <javascript:>
> > <mailto:[email protected] <javascript:>>.
> > To post to this group, send email to [email protected]
> <javascript:>
> > <mailto:[email protected] <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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.