Am 08.07.2014 18:51, schrieb Jonathan Rogers:
> On 07/08/2014 12:39 PM, Cornelius Kölbel wrote:
>> Hi there,
>>
>> I am wondering how the following would be translated to sqlalchemy.
>>
>> I have three tables:
>>
>> "ClientMachine"
>> "MachineToken"
>> "Token"
>>
>> The table MachineToken acts as n:m mapping between "ClientMachine" and
>> "Token".
>> Each machine can have several tokens assigned.
>>
>> Looks like this:
>>
>> machinetoken_table = sa.Table('MachineToken', meta.metadata,
>> sa.Column('id',
>> sa.types.Integer(),
>>
>> sa.Sequence('machinetoken_seq_id', optional=True),
>>
>> primary_key=True, nullable=False),
>> sa.Column("token_id",
>> sa.types.Integer(), ForeignKey('Token.privacyIDEATokenId')),
>>
>> sa.Column("machine_id", sa.types.Integer(), ForeignKey('ClientMachine.id')),
>>
>> sa.Column("application", sa.types.Unicode(64)),
>>
>> UniqueConstraint('token_id', 'machine_id', 'application', name='uix_1'),
>>
>> implicit_returning=implicit_returning,
>> )
>>
>> Now I'd like to get a list of all machines and if the machine has token-
>> and application-information also this information.
>>
>> I figured out a left outer join:
>>
>> select cl.cm_name
>> , mt.application
>> , (select privacyIDEATokenSerialnumber from Token where
>> privacyIDEATokenId = mt.token_id) as Serial
>> FROM ClientMachine cl
>> LEFT JOIN MachineToken mt
>> ON cl.id = mt.machine_id
> I'd just use another outer join rather than a subquery:
>
> select cl.cm_name
> , mt.application
> , privacyIDEATokenSerialnumber
> FROM ClientMachine cl
> LEFT JOIN MachineToken mt
> ON cl.id = mt.machine_id
> LEFT JOIN Token
> ON privacyIDEATokenId = mt.token_id
>
>> This will give me one machine entry per assigned "Token" or
>> "MachineToken.application". This is my intended result. fine.
>> I need to translate the MachineToken.token_id to a human readable
>> Serialnumber, this is why I have the line
>>
>> (select privacyIDEATokenSerialnumber from Token where
>> privacyIDEATokenId = mt.token_id)
>>
>> To my understandung I would do in SQLA something like this:
>>
>>
>> Session.query(ClientMachine).outerjoin(MachineToken).filter(ClienteMachine.id
>> == MachineToken.machine_id)
>>
>> But how would I add the Serialnumber from the table "Token"?
> Since you've already defined the foreign keys in SQLA, you shouldn't
> need to do so again in the query. You can get any number of values
> from a query. Try something like this:
>
> Session.query(ClientMachine, Token.privacyIDEATokenSerialnumber) \
> .outerjoin(MachineToken).outerjoin(Token)
>
> That should give pairs of a ClientMachine instance and a
> privacyIDEATokenSerialnumber.
>
>
Hi Jonathon,
thanks a lot for the hint. Looks good to me.
Kind regards
Cornelius
--
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.