sqlalchemy模型的已定义列上迭代的方法?

发布于 2021-01-29 18:58:56

我一直在尝试找出如何遍历SQLAlchemy模型中定义的列的列表。我想要为一些模型编写一些序列化和复制方法。我不能仅对其进行迭代,obj.__dict__因为它包含很多SA特定项。

有人知道一种从以下内容中获取iddesc名称的方法吗?

class JobStatus(Base):
    __tablename__ = 'jobstatus'

    id = Column(Integer, primary_key=True)
    desc = Column(Unicode(20))

在这种情况下,我可以轻松创建一个:

def logme(self):
    return {'id': self.id, 'desc': self.desc}

但我更喜欢自动生成dict(对于较大的对象)的东西。

关注者
0
被浏览
41
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用以下功能:

    def __unicode__(self):
        return "[%s(%s)]" % (self.__class__.__name__, ', '.join('%s=%s' % (k, self.__dict__[k]) for k in sorted(self.__dict__) if '_sa_' != k[:4]))
    

    它将排除SA 魔术 属性,但不排除关系。因此,基本上它可能会加载依赖项,父项,子项等,这绝对是不可取的。

    但这实际上要容易得多,因为如果您继承自Base,则拥有一个__table__属性,因此您可以执行以下操作:

    for c in JobStatus.__table__.columns:
        print c
    
    for c in JobStatus.__table__.foreign_keys:
        print c
    

    请参阅如何从SQLAlchemy映射的对象中发现表属性-类似的问题。

    迈克(Mike)编辑:
    请参见Mapper.cMapper.mapped_table之类的函数。如果使用0.8或更高版本,还请参见Mapper.attrs和相关函数。

    Mapper.attrs的示例:

    from sqlalchemy import inspect
    mapper = inspect(JobStatus)
    for column in mapper.attrs:
        print column.key
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看