我想在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”工作。希望这能澄清这个问题。
答案 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())