如何迭代列以获取sqlalchemy中的子列表?

时间:2016-06-03 11:11:57

标签: python sqlalchemy

我想使用sqlalchemy从这样的表中获取子列表:

Column1    Column2
   a          1
   a          2
   b          1
   b          2

并首先获得

Column1    Column2
   a          1
   a          2

其次获得

Column1    Column2
   b          1
   b          2

我可以通过执行一次查询语言来实现吗?

1 个答案:

答案 0 :(得分:0)

您可以使用单个查询执行此操作,但需要在Python中执行分组。为此,您可以使用itertools.groupby来处理您要订购的查询结果(column1column2)。这是一个例子:

from itertools import groupby
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()
class Stuff(Base):
    __tablename__ = 'stuff'
    id = Column(Integer, primary_key=True)
    column1 = Column(String(10))
    column2 = Column(String(10))

    def __repr__(self):
        return '({}, {})'.format(self.column1, self.column2)

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

for k, g in groupby(session.query(Stuff).order_by(Stuff.column1, Stuff.column2),
                    key=lambda stuff: stuff.column1):
    print('{}: {}'.format(k, ','.join(stuff.column2 for stuff in g)))

如果您的表包含此数据:

Column1    Column2
   a          1
   a          2
   b          1
   b          2
   a          3
输出将是:

a: 1,2,3
b: 1,2

要处理数据,请使用处理代码替换for循环中的print()