在sqlalchemy

时间:2016-05-11 08:28:41

标签: postgresql 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)的查询,如果该行不存在则因为该键不正确。现在正在处理别名类:

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)语法错误在“SELECT”处或附近

我正在使用SQLAlchemy 1.0.12和postgresql 9.4。 任何有关我错过的帮助或其他可以做得更好的方法都非常感谢

干杯

1 个答案:

答案 0 :(得分:0)

为什么不使用简单的outerjoin

attrkey = 'my_attr_key'

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