捡咸鱼的二七 2023-02-12 18:30 采纳率: 33.3%
浏览 70
已结题

Python的sqlalchemy框架中多表联合查询问题?

在使用 PythonSqlAlchemy数据库框架时,碰到了如下问题

现有两张表:

A表:

TID  主键
PID  PID
Title  标题

B表:

GID  主键
PID  PID
Name  名称

两张表中PID相关联,A表中的一条数据,对应着B表中的多条数据,
现在我想查出B表中所有和A表中数据关联的数据,并用以下形式展现:

[{
        "TID": "01",
        "PID": "1",
        "Title": "标题1",
        "Name": ["名称1", "名称2", "名称3"...]
    },
    {
        "TID": "02",
        "PID": "2",
        "Title": "标题2",
        "Name": ["名称1", "名称2", "名称3"...]
    }
        ......
]

请问该如何实现?

  • 写回答

4条回答 默认 最新

  • 社区专家-Monster-XH 2023-02-12 19:16
    关注

    用 SQLAlchemy 的 ORM 进行查询。那你就先要建立两张表的 ORM 模型,然后用 SQLAlchemy 的 join 功能进行连接,最后可以把结果转换为列表,再按所需进行组装。
    代码如下:

    from sqlalchemy import create_engine, Column, Integer, String
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy.ext.declarative import declarative_base
    
    Base = declarative_base()
    
    class ATable(Base):
        __tablename__ = 'A'
        TID = Column(Integer, primary_key=True)
        PID = Column(Integer)
        Title = Column(String)
    
    class BTable(Base):
        __tablename__ = 'B'
        GID = Column(Integer, primary_key=True)
        PID = Column(Integer)
        Name = Column(String)
    
    engine = create_engine('sqlite:///:memory:')
    Session = sessionmaker(bind=engine)
    session = Session()
    
    result = session.query(ATable, BTable).join(BTable, ATable.PID == BTable.PID).all()
    
    data = []
    for a, b in result:
        if len(data) == 0 or data[-1]['TID'] != a.TID:
            data.append({'TID': a.TID, 'PID': a.PID, 'Title': a.Title, 'Name': [b.Name]})
        else:
            data[-1]['Name'].append(b.Name)
    
    print(data)
    
    
    
    

    上面的代码使用了 SQLite 数据库,如果要使用其他数据库,要修改 create_engine 中的数据库链接字符串。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月20日
  • 已采纳回答 2月12日
  • 赞助了问题酬金15元 2月12日
  • 创建了问题 2月12日

悬赏问题

  • ¥15 r语言神经网络自变量重要性分析
  • ¥15 基于双目测规则物体尺寸
  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢