2014-02-18 56 views
3

我想向sqlalchemy模型中的列添加一個自定義屬性「searchable」。目的是爲這些列提取數據(使用ModelFoo .__ table __。columns)並將數據放入solr。有沒有一種方法可以使用自定義屬性來標記某些列?在sqlalchemy表中標記列

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

你的問題是有點未清除。你想要什麼數據,你把數據放在哪裏? –

+0

我想只將某些字段的數據放入solr,而不是整個對象,如下所示:http://opensource.timetric.com/sunburnt/addingdocuments.html –

回答

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

我對你的問題有點不清楚,但它看起來像你正在嘗試做從link你提供的是這樣的:

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

哪裏Book.objects.all()是從ORM映射表中的記錄列表。請注意,文檔說對象列表也是可以接受的。我想這裏的解決方案是使用SQLAlchemy查詢方法來創建只有你想要的字段的記錄。使用你的榜樣應該是這樣的:

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

嗨,是的,這就是我想要的,但我正在尋找一個通用的可以應用於任何模型的解決方案。讓我更新原來的問題,給予一些清晰。 –

+0

我更新了問題。 –

+0

如果您確實需要添加屬性,您可以在類定義之外使用'ModelFoo.os.searchable = True'來完成此操作。我不知道這是什麼讓你,雖然沒有「廣義」的解決方案。您必須定義查詢中或ORM定義中的「可搜索」列。 – ACV