当前位置: 首页 > 面试题库 >

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

闾丘英悟
2023-03-14
问题内容

我一直在尝试找出如何遍历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(对于较大的对象)的东西。


问题答案:

您可以使用以下功能:

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.c和Mapper.mapped_table之类的函数。如果使用0.8或更高版本,还请参见Mapper.attrs和相关函数。

Mapper.attrs的示例

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


 类似资料:
  • 问题内容: 当渴望加载子关系时,如何仅加载父模型的几列: 如果我仅需要模型的列,则此方法有效: 但这会引发错误: 查询仅具有基于表达式的实体-找不到名为“章节”的属性。 换句话说,我希望使用ORM语法编写此SQL: 问题答案: 错误消息指出您只是选择,而不是的实例。如果返回的只是字符串列表(用于),该去哪里。 您可以执行以下任一操作: 或者

  • 如何将此迭代器与泛型类型一起使用?以下是我在“main”函数中尝试的方法: 结果是:<代码>无法从静态上下文引用非静态类项 结果是:<代码>无法从静态上下文引用非静态类项 结果: 编辑: 我调用的是类而不是方法。这项工作: 迭代器it=deq。迭代器(); 我认为,由于iterator()中返回的实例的类型是ListIterator,因此我需要使用该类型声明“it”。

  • 问题内容: 对于Java语言有些陌生,我试图使自己熟悉所有可能遍历列表(或其他集合)的方式(或至少是非病理性方式)以及每种方式的优缺点。 给定一个对象,我知道以下遍历所有元素的方式: 基本的for 循环(当然,也有等效的while/ do while循环) 注意:正如@a​​marseillan指出的那样,这种形式对于在s上进行迭代是一个糟糕的选择,因为该方法的实际实现可能不如使用时有效。例如,实

  • 由于对Java语言有些陌生,我正在尝试熟悉所有可以通过列表(或者其他集合)进行迭代的方法(或者至少是非病态的方法),以及每种方法的优缺点。 给定一个对象,我知道以下循环所有元素的方法: 注意:正如@Amarseillan所指出的,对于迭代s,此表单是一个糟糕的选择,因为方法的实际实现可能不如使用时那样高效。例如,实现必须遍历i之前的所有元素以获得第i个元素。 在上面的示例中,实现没有办法“保留它的

  • 假设我有3个要关闭的Scanner实例。 我可以做 对于每个扫描仪。 或者我可以做类似的事情 使用Java8有没有更简单的方法? 类似的东西?

  • 英文原文:http://emberjs.com/guides/models/defining-models/ 模型是一个定义了需要呈现给用户的数据的属性和行为的类。任何用户往返于应用(或者刷新页面)能看到的内容都需要使用模型来表示。 应用中所有的模型,都继承与DS.Model: 1 App.Person = DS.Model.extend(); 在定义了一个模型类之后,就可以开始查询或者创建一