【问题标题】:marking columns in sqlalchemy tables在 sqlalchemy 表中标记列
【发布时间】:2014-03-18 00:36:18
【问题描述】:

我想向 sqlalchemy 模型中的列添加自定义属性“可搜索”。目的是仅提取这些列的数据(使用 ModelFoo.__ table__.columns)并将数据放入 solr。有没有办法可以使用自定义属性标记某些列?

class ModelFoo(AppBase):
    __tablename__ = 'foo'
    id = Column("id", Integer, primary_key=True, autoincrement=True)
    os = Column(String, nullable=False, searchable=True)
    platform = Column(String, searchable=True)

默认情况下,我在尝试上述操作时会收到以下错误:

sqlalchemy.exc.ArgumentError: Unknown arguments passed to Column: ['searchable']

我正在寻找一种仅向 solr 添加“可搜索”列的通用方法,类似于以下内容:

for table in Base.metadata.tables.values():
    keys = [str(key) for key in table.columns if key.searchable] 
    solr.add(session.query(*keys).all())

在上面的代码中,我正在寻找一些简短的解决方案或替代方案来让“key.searchable”工作。希望这可以澄清问题。

【问题讨论】:

标签: python solr sqlalchemy flask-sqlalchemy


【解决方案1】:

我使用模型中的单独属性解决了这个问题:

class ModelFoo(Base):
    __tablename__ = 'foo'
    id = Column("id", Integer, primary_key=True, autoincrement=True)
    os = Column(String, nullable=False)
    platform = Column(String)
    search_cols = ["os", "value"]

for k, v in list(Base._decl_class_registry.items()):
    if (hasattr(v, "search_cols")):
        cols = [getattr(v, val) for val in v.search_cols]
        query = sess.query(*cols)
        solr.add(query.all())

【讨论】:

    【解决方案2】:

    我对你的问题有点不清楚,但看起来你正试图从你提供的link 做这样的事情:

    si.add(Book.objects.all())
    

    其中Book.objects.all() 是来自 ORM 映射表的记录列表。请注意,文档说对象列表也是可以接受的。我认为这里的解决方案是使用 SQLAlchemy 查询方法来构建仅包含您想要的字段的记录。使用您的示例如下所示:

    si.add(session.query(ModelFoo.os, ModelFoo.platform).all())
    

    【讨论】:

    • 嗨,是的,这就是我想要的,但我正在寻找可以应用于任何模型的通用解决方案。让我更新一下原来的问题,让我更清楚。
    • 如果您确实需要添加属性,您可以在类定义之外使用ModelFoo.os.searchable = True 执行此操作。我不确定这会给您带来什么,因为没有“通用”解决方案。您要么必须在查询或 ORM 定义中定义“可搜索”列。
    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 2013-06-19
    • 1970-01-01
    • 2020-05-07
    • 2018-07-18
    • 1970-01-01
    • 2010-12-31
    • 2020-03-31
    相关资源
    最近更新 更多