我们正在使用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。 任何有关我错过的帮助或其他可以做得更好的方法都非常感谢
干杯
答案 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,
)
)
)