代码之家  ›  专栏  ›  技术社区  ›  Seamus Campbell

声明类的SQLAlchemy自省

  •  7
  • Seamus Campbell  · 技术社区  · 14 年前

    我正在编写一个小的sqlAlchemy填充程序来从MySQL数据库中导出数据,其中一些轻量级的数据转换主要是更改字段名。我当前的脚本可以很好地工作,但基本上需要我在类声明中描述我的模型两次,一次作为字段名列表进行迭代。

    我正在尝试找出如何使用自省来识别列访问器的行对象上的属性。以下工作几乎完美:

    for attr, value in self.__class__.__dict__.iteritems():
        if isinstance(value, sqlalchemy.orm.attributes.InstrumentedAttribute):
            self.__class__._columns.append(attr)
    

    除了my to many关系访问器也是sqlachemy.orm.attributes.instructedAttribute的实例之外,我需要跳过这些实例。在我查课堂词典时,有没有办法区分这两者?

    我在sqlAlchemy自省中找到的大多数文档都涉及到metadata.table,但是由于我要重命名列,所以这些数据不适用于普通的映射。

    3 回复  |  直到 12 年前
        1
  •  7
  •   tux21b    14 年前

    每个映射实体的映射器都有一个属性 columns 所有列定义。例如,如果您有一个声明性类 User 您可以使用 User.__mapper__ 以及列:

    list(User.__mapper__.columns)
    

    每列有几个属性,包括 name (可能与名为 key ) nullable , unique 等等…

        2
  •  1
  •   Seamus Campbell    14 年前

    我仍然希望看到这个问题的答案,但是我已经通过名字管理关系访问器(例如,“OtherEntity”而不是“OtherEntity”),然后过滤名称来解决这个问题。为我的目的工作得很好。

        3
  •  1
  •   Drew    12 年前

    InstrumentedAttribute 实例有一个名为 impl 那是在练习A ScalarAttributeImpl A ScalarObjectAttributeImpl ,或者 CollectionAttributeImpl .

    我不确定这有多脆弱,但我只是检查它是哪一个来确定一个实例最终是返回一个列表还是一个对象。