标记sqlalchemy表中的列

时间:2014-02-18 10:21:35

标签: python solr sqlalchemy flask-sqlalchemy

我想在sqlalchemy模型中的列中添加自定义属性“searchable”。目的是仅为这些列提取数据(使用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”工作。希望这能澄清这个问题。

2 个答案:

答案 0 :(得分:2)

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

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())

答案 1 :(得分:0)

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

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

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

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