2017-12-08 4 views
0

Betrachten Sie die folgenden SQL müssen darstellen:
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_idHerstellung mehrerer verbindet sich mit sqlalchemy Statement und Ausdruck api

nun die ORM-Modelle, wie sie unter:

from sqlalchemy import Column, Integer, String 
from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 
metadata = Base.metadata 

class User(Base): 
    __tablename__ = 'user' 
    id = Column(Integer, primary_key=True) 
    name = Column(String 

class Address(Base): 
    __tablename__ = 'address' 
    id = Column(Integer, primary_key=True) 
    address_name = Column(String(64)) 
    user_id = Column(Integer) 

class PostalCode(Base): 
    __tablename__ = 'postal_code' 
    id = Column(Integer, primary_key=True) 
    code = Column(Integer) 

Wenn einfach tun wie beitreten:

from sqlalchemy import select, join 
u = User 
add = Address 
po = PostalCode 

query = select([u.id, u.name]).select_from(join(u,add, u.id = add.user_id)) 
print(query) 

ergibt eqvivalent Ausdruck zu über ursprünglichen SQL.

aber wenn ich so etwas tun wollen:
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id JOIN postal_code ON postal_code.id = address.id

durch Schreiben:

query = select([u.id, u.name]).select_from(join(u,add, u.id = add.user_id).join(po, po.id = add.id)) 
print(query) 

einen Fehler Diese ergeben etwas sagen wie:

Attributeerror: type object ____ has no attribute '_from_objects` 

Jede Idee, was falsch ist mit meiner Syntax für die Verwendung von zwei Joins?
Die Erklärung, wie mit einem join ist here.

+0

Versuchen: 'query = select ([u.id, u.name]) select_from (beitreten (join (. u, add, u.id = add.user_id), po, po.id = add.id)) drucken (abfragen) ' –

+0

Können Sie überprüfen, ob Sie Ihren Code korrekt reproduziert haben? Ihre Join-Bedingungen weisen Syntaxfehler auf. – univerio

+0

@univerio: in der Tat scheint Nikhil Vorschlag gut zu funktionieren – JavaSa

Antwort

1

von subquerying einen Join können Sie ein mehr erreichen beitreten:

query = select([u.id, u.name]).select_from(join(join(u,add, u.id = add.user_id),po, po.id = add.id)) 
print(query) 
0

Erwägen Sie Ihre Fremdschlüsselfelder und Beziehungen zu Ihren Modellen wie folgt vorgegeben:

from sqlalchemy import Column, Integer, String, ForiegnKey 
from sqlalchemy.orm import relationship 
from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 
metadata = Base.metadata 

class User(Base): 
    __tablename__ = 'user' 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    address = relationship('address') 

class Address(Base): 
    __tablename__ = 'address' 
    id = Column(Integer, primary_key=True) 
    address_name = Column(String(64)) 
    user_id = Column(Integer, ForeignKey('user.id')) 
    postal_code = relationship('postal_code') 

class PostalCode(Base): 
    __tablename__ = 'postal_code' 
    id = Column(Integer, ForeignKey('address.id'), primary_key=True) 
    code = Column(Integer) 
    address = relationship('address') 

query = select(user.id, user.name).\ 
    join(address).\ 
    join(postal_code) 

print(query) 

des Lauf sollte die Abfrage aus der ursprünglichen Nachricht erzeugen.

Dann magisch, Sie können aufhören zu verbinden in Ihre wählt alle zusammen!

query = select(user.name, 
    user.address.address_name, 
    user.address.postal_code.code) 
Verwandte Themen