在使用 Python
的 SqlAlchemy
数据库框架时,碰到了如下问题
现有两张表:
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值作为列表存储在结果字典中。