SQLAlchemy连接到同一列上的表,但还需要resu中其他列的数据

2024-04-19 12:33:03 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个这样定义的模型:

class DstEntry(Base):
    __tablename__ = 'dst_entry'

    id = Column('id', DBKeyType, primary_key=True)
    name = Column(String(64))
    ip_addr = Column(IPAddress)
    logical_device_ip = Column(String(64))

我有这样的数据:

id   name      ip_addr      logical_device_ip
--------------------------------------------------
1    l3dst     3.3.3.3/32   192.168.99.151
2    httpdst   1.1.1.1/32   192.168.99.152   <===
3    httpdst2  2.2.2.0/24   192.168.99.151
4    dddd      1.1.1.1/32   192.168.99.153   <===
5    httpdst   1.1.1.1/32   192.168.99.151   <===
6    aadst     4.4.4.4/32   192.168.99.153

我希望能够执行一个查询,最终得到一些信息,告诉我:

ip_addr     logical_device_ip
--------------------------------------------------
1.1.1.1/32  192.168.99.151, 192.168.99.152, 192.168.99.153
3.3.3.3/32  192.168.99.151
2.2.2.0/24  192.168.99.151
4.4.4.4/32  192.168.99.153

我该如何使用sqlalchemy?你知道吗


Tags: name模型ipidbasestring定义device
1条回答
网友
1楼 · 发布于 2024-04-19 12:33:03

试试这个:

res = session.query(
       DstEntry.ip_addr,
       func.group_concat(DstEntry.logical_device_ip)
       ).group_by(DstEntry.ip_addr)

for r in res:
    print r

注意:

  1. 结果中的logical_device_ip,作为分隔符连接。如果要在分隔符中添加空格字符,请改为这样做

    res = session.query(
           DstEntry.ip_addr,
           func.group_concat(DstEntry.logical_device_ip.op('SEPARATOR')(', '))
           ).group_by(DstEntry.ip_addr)
    
  2. MySQL的原始SQL查询是:

    SELECT ip_addr,
           GROUP_CONCAT(logical_device_ip) AS logical_device_ip
    FROM dst_entry
    GROUP BY ip_addr;
    

相关问题 更多 >