使用sqlalchemy语句和表达式api产生多个联接

Jav*_*aSa 1 python mysql join sqlalchemy python-3.x

考虑您具有以下sql来表示:
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id

现在具有以下orm模型:

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)
Run Code Online (Sandbox Code Playgroud)

在进行简单连接时,例如:

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)
Run Code Online (Sandbox Code Playgroud)

将产生等同于上述原始sql的等价表达式。

但是,如果我想做类似的事情:
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id JOIN postal_code ON postal_code.id = address.id

通过写:

query = select([u.id, u.name]).select_from(join(u,add, u.id = add.user_id).join(po, po.id = add.id))
print(query)  
Run Code Online (Sandbox Code Playgroud)

这会产生一个错误,内容如下:

Attributeerror: type object ____ has no attribute '_from_objects`  
Run Code Online (Sandbox Code Playgroud)

知道我使用两个联接的语法有什么问题吗?
如何使用一个的解释join在这里

小智 5

通过子查询联接,您可以实现多个联接:

query = select([u.id, u.name]).select_from(join(join(u,add, u.id = add.user_id),po, po.id = add.id)) 
print(query)
Run Code Online (Sandbox Code Playgroud)