【问题标题】:SQLAlchemy introspection of declarative classes声明性类的 SQLAlchemy 自省
【发布时间】:2011-03-23 18:04:34
【问题描述】:

我正在编写一个小型 sqlalchemy shim 来从 MySQL 数据库中导出数据,并进行一些轻量级的数据转换——主要是更改字段名称。我当前的脚本工作正常,但需要我基本上描述我的模型两次——一次在类声明中,一次作为要迭代的字段名称列表。

我试图弄清楚如何使用自省来识别作为列访问器的行对象的属性。以下工作几乎完美:

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

除了我的对多关系访问器也是 sqlalchemy.orm.attributes.InstrumentedAttribute 的实例,我需要跳过这些。在我检查类字典时,有什么方法可以区分这两者吗?

我在 sqlalchemy introspection 上找到的大多数文档都涉及查看 metadata.table,但由于我正在重命名列,因此该数据并非可轻松映射。

【问题讨论】:

    标签: python sqlalchemy introspection declarative


    【解决方案1】:

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

    list(User.__mapper__.columns)
    

    每一列都有多个属性,包括name(可能与名为key的映射属性不同)、nullableunique等等...

    【讨论】:

    • 这似乎比检查 metadata.tables['mytable'].columns 更普遍有用,但它似乎不允许我发现描述符在我的实体类,所以我留下了如何生成将类属性名称映射到它们的值的输出的原始问题。
    【解决方案2】:

    我仍然希望看到这个问题的答案,但我已经通过命名关系访问器(例如“_otherentity”而不是“otherentity”)然后过滤名称来解决它。适合我的目的。

    【讨论】:

      【解决方案3】:

      InstrumentedAttribute 实例有一个名为impl 的属性,实际上是ScalarAttributeImplScalarObjectAttributeImplCollectionAttributeImpl

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-14
        • 2021-11-05
        • 1970-01-01
        • 2012-10-19
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多