【发布时间】:2013-12-20 23:40:34
【问题描述】:
考虑以下表定义
class MCastSession(Base):
__tablename__ = 'mcast_session'
id = Column(Integer, primary_key=True)
ip = Column(Integer)
port = Column(Integer)
__table_args__ = ( UniqueConstraint('ip', 'port'), )
class Topic(Base):
__tablename__ = 'topic'
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
mcast_session_id = Column(Integer, ForeignKey('mcast_session.id'))
mcast_session = relationship('MCastSession')
class Host(Base):
__tablename__ = 'host'
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
class Subscriber(Base):
__tablename__ = 'subscriber'
id = Column(Integer, primary_key=True)
topic_id = Column(Integer, ForeignKey('topic.id'))
topic = relationship('Topic')
host_id = Column(Integer, ForeignKey('host.id'))
host = relationship('Host')
__table_args__ = ( UniqueConstraint('topic_id', 'host_id'), )
Example data:
Topic Session
T1 IP1:port1
T2 IP1:port2
T3 IP1:port2
T4 IP2:port1
Topic Host
T1 H1
T2 H1
T4 H2
我想编写一个查询来获取订阅多播 ip 但不处理该 ip 的所有主题的所有主机。在上面的例子中。 H1 有 T1,因此订阅了 IP1,但没有 T3,T3 也有相同的 IP1。所以查询应该返回 H1。 H2 为其订阅的 ips (T4) 处理所有主题(T4),因此 H2 不应出现在结果中。如何编写上述查询?
【问题讨论】:
-
如果有人可以帮助处理原始 SQL 查询,那也会有所帮助
-
引用同一个表两次:
select a.* from my_tab as first_reference join my_tab as second_reference on first_reference.ID = second_reference.ID +1
标签: python sqlite database-design orm sqlalchemy