2016-05-11 168 views
0

我們正在實施帶有SQLAlchemy的工作流引擎。在我們的模型 兩個表是:在sqlalchemy的情況下選擇語句

class DbAttribute(Base): 
    __tablename__ = "db_dbattribute" 
    id = Column(Integer, primary_key = True) 
    dbnode_id = Column(Integer, ForeignKey('db_dbnode.id')) 
    key = Column(String(255)) 
    datatype = Column(String(10)) 
    tval = Column(String, default='') 
    fval = Column(Float, default=None, nullable=True) 
    ival = Column(Integer, default=None, nullable=True) 
    bval = Column(Boolean, default=None, nullable=True) 
    dval = Column(DateTime, default=None, nullable=True) 
class DbNode(Base): 
    __tablename__ = "db_dbnode" 
    id = Column(Integer, primary_key=True) 
    uuid = Column(UUID(as_uuid=True), default=uuid_func) 
    type = Column(String(255), index=True) 
    label = Column(String(255), index=True, nullable=True) 
    description = Column(Text(), nullable=True) 
    ctime = Column(DateTime(timezone=True), default=timezone.now) 
    mtime = Column(DateTime(timezone=True), default=timezone.now) 

屬性是通過dbnode_id外鍵關聯到一個節點。 我現在正在處理一個將返回屬性值(例如tval)的查詢,如果由於該鍵不正確而導致該行不存在,則返回None。這是工作的別名類現在:

select_stmt =select([aliased_attributes.tval]).select_from(
     aliased_attributes 
    ).where(and_(
     aliased_attributes.key==attrkey, 
     aliased_attributes.dbnode_id==aliased_node.id 
    )) 
exists_stmt = exists(select_stmt) 

entity = case([ 
    (
     exists_stmt, 
     select_stmt 
    ), 
    (
     text('true'), 
     None 
    ) 
]) 

這與下面的錯誤,現在退出:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) syntax error at or near "SELECT"

我使用SQLAlchemy的1.0.12和PostgreSQL 9.4。 什麼我錯過或其它方面,本可以做的更好任何幫助是極大的讚賞

乾杯

回答

0

爲什麼不直接使用簡單的outerjoin

attrkey = 'my_attr_key' 

q = (
    session 
    .query(
     DbNode.label, 
     DbAttribute.tval, 
    ) 
    .outerjoin(
     DbAttribute, 
     and_(
      DbAttribute.dbnode_id == DbNode.id, 
      DbAttribute.key == attrkey, 
     ) 
    ) 
) 
+0

非常感謝。一個簡單的外聯(就像你的解決方案)在簡單情況下工作正常。但是,如果您必須將多個DbNode實體連接在一起,則屬性的投影必須成爲子查詢。這正是我所苦苦掙扎的。我應該更具體地說,對不起 – nikka

+0

@nikka:你也可以執行多個連接。你只需要使用別名。請參閱[使用別名](http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#using-aliases) – van

+0

非常感謝,我會給它一個機會! – nikka