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"...]
    }
        ......
]

请问该如何实现?

用 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 中的数据库链接字符串。

回答不易,求求您采纳哦 感激不尽

可以使用 SQLAlchemy 的 ORM 框架来实现多表联合查询,并将结果以指定格式返回。

首先,需要定义两个数据模型,分别对应 A 表和 B 表:

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)



然后,使用 session.query() 方法对两个表进行多表联合查询,并使用 join() 方法进行关联:

engine = create_engine('数据库连接字符串')
Session = sessionmaker(bind=engine)
session = Session()

result = session.query(ATable, BTable).join(BTable, ATable.PID==BTable.PID).all()


最后,使用 for 循环对结果进行处理,并将结果以指定格式返回:

data = {}
for a, b in result:
    if a.TID not in data:
        data[a.TID] = {
            "TID": a.TID,
            "PID": a.PID,
            "Title": a.Title,
            "Name": []
        }
    data[a.TID]["Name"].append(b.Name)

res = [v for k, v in data.items()]


最终,res 变量的值就是所需的数据,可以直接返回。

您可以使用 SQLAlchemy 进行多表关联查询。首先,您需要使用 SQLAlchemy 创建两个模型类,表示两张表:A表和B表。然后,可以在 A 表模型中定义一个关系字段,以查询与 A 表相关联的 B 表记录:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class A(Base):
    __tablename__ = 'A'
    TID = Column(Integer, primary_key=True)
    PID = Column(Integer)
    Title = Column(String)
    bs = relationship("B", back_populates="a")

class B(Base):
    __tablename__ = 'B'
    GID = Column(Integer, primary_key=True)
    PID = Column(Integer, ForeignKey('A.PID'))
    Name = Column(String)
    a = relationship("A", back_populates="bs")

engine = create_engine('sqlite:///test.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

res = session.query(A).all()
result = []
for a in res:
    b_names = [b.Name for b in a.bs]
    result.append({"TID": a.TID, "PID": a.PID, "Title": a.Title, "Name": b_names})

print(result)

这段代码定义了两个模型类 A 和 B,并使用relationship字段定义了两张表之间的关系。然后,通过 SQLAlchemy ORM 查询所有 A 表记录,并将 B 表记录的Name值作为列表存储在结果字典中。