sqlalchemy多表连接查询

想做一个能够自动读取数据库中字段名称和设置的数据类型的Python程序。

最后的展示形式如下:

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

如:id_index=Column(int)

其中需要用到三张表:SysColumns SysObjects SysTypes

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)

# SysTypes是我新加入的表格定义
class SysTypes(BaseModel):
    __tablename__ = "SysTypes"
    name = Column(String, primary_key=True)
    xtype = Column(String)

注意:SysColumns跟SysObjects可以用id连接,Systypes跟SysColumns可以用xtype连接。

源程序只有两个表连接,如下:

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表中,读取字段xtype值为56代表的数据类型name是int,最后显示成如下形式。

id_index=Column(int)

现在我不清楚如何将这三个表连接?

我的设想结果是:

print "{0}{1}=Column({2})".format(" "*5,sysColumns.name,Systypes.name)
阅读 15.2k
1 个回答

连着继续join就可以了

def dispMod(session,tableName):
    // query里放入所需的要查出的所有字段SysColumns.name,Systypes.name
    result=session.query(SysColumns.name,Systypes.name). \
        join(SysObjects,SysColumns.id==SysObjects.id).\
        join(SysTypes, SysObjects.xtype==SysTypes.xtype).\
            filter(SysObjects.xtype=='u').\
            filter(SysObjects.name==tableName).\
            order_by(SysColumns.colorder)

    for row in result:
        print "{0}{1}=Column({2})".format(" "*5,row[0],row[1])
       
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进