如何将第三个表加入两个联合表的结果中?

时间:2016-09-09 05:36:50

标签: python sqlalchemy

我正在编写一个python程序来读取列的名称以及需要满足的列的类型。

我想把结果放在这样:

id_index=Column(int)

使用print

print "{0}{1}=Column({2})".format(" "*5,SysColumns.name,SysTypes.xtype)

我将使用三个表:SysColumnsSysObjectsSysTypes

class SysColumns(BaseModel):
     __tablename__ = "SysColumns"
     name=Column(String,primary_key=True)
     colorder=Column(Integer,primary_key=True)
     id=Column(Integer,primary_key=True)
     xtype = Column(String, primary_key=True) 

class SysObjects(BaseModel):
     __tablename__ = "SysObjects"
     name=Column(String)
     id=Column(Integer,primary_key=True)
     xtype=Column(String,primary_key=True)

class SysTypes(BaseModel):
    __tablename__ = "SysTypes"
    name = Column(String, primary_key=True)
    xtype = Column(String)

SysColumnsid中具有相同的列SysObjects,而SysTypesxtype中具有相同的列SysColumns

原始代码如下:

def dispMod(session,tableName):
    result=session.query(SysColumns). \
        join(SysObjects,SysColumns.id==SysObjects.id).\
            filter(SysObjects.xtype=='u').\
            filter(SysObjects.name==tableName).\
            order_by(SysColumns.colorder)

    for sysColumns in result:
        print "{0}{1}=Column({2})".format(" "*5,SysColumns.name,SysColumns.xtype)

结果可以显示为:

id_index=Column(56)

现在我需要在SysTypes中搜索数字56,将其更改为它所代表的类型。

SysTypes包含SysTypes.xtypeSysTypes.name列。 我希望它显示名称而不是xtype

print "{0}{1}=Column({2})".format(" "*5,SysColumns.name,Systypes.name)

我不知道如何使用上面的结果加入Systypes表来查找其中的名称。

我可以编写查询一次搜索SysColumns.nameSysTypes.name吗?

1 个答案:

答案 0 :(得分:0)

只需在另一个之后添加联接并仅选择名称:

session.query(SysColumns.name, SysTypes.name).\
    join(SysObjects, SysColumns.id == SysObjects.id).\
    join(SysTypes, SysTypes.xtype == SysColumns.xtype).\
    filter(SysObjects.xtype == 'u').\
    filter(SysObjects.name == tableName).\
    order_by(SysColumns.colorder)