我使用SQLAlchemy的模型如下概念:查詢SQLAlchemy的許多一對多的關係
- 用戶可以是一個
member_of
組 - A組可以有多個用戶爲
members
和可以提供access_to
多個Nodes
。 - 節點可以是
accessed_by
多個Groups
我使用的關聯表模式創造出許多爲用戶帶來很多的關係 - >集團及節點 - >集團。
的代碼如下(我用的燒瓶的SQLAlchemy這就是爲什麼我有db.Model等)
我如何可以查詢,可以通過所有組的訪問的所有節點是用戶是否是成員?
這裏的對象模型
group_access = Table('access', db.metadata,
Column('group_id', Integer, ForeignKey('groups.group_id')),
Column('nid', BigInteger, ForeignKey('nodes.nid')),
)
group_membership = Table('membership', db.metadata,
Column('group_id', Integer, ForeignKey('groups.group_id')),
Column('uid', Integer, ForeignKey('users.id')),
)
edges = Table('edges', db.metadata,
Column('src_id', BigInteger, ForeignKey('nodes.nid'), primary_key=True),
Column('dest', BigInteger, ForeignKey('nodes.nid'), primary_key=True),
)
class User(db.Model):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String, unique=True, nullable=False)
member_of = relationship("Group", secondary=group_membership, back_populates='members')
def __init__(self, email):
self.email = email
class Node(db.Model):
__tablename__ = 'nodes'
nid = Column(BigInteger, primary_key=True)
type = Column(String)
parents = relationship("Node",
secondary=edges,
primaryjoin="Node.nid==edges.c.src_id",
secondaryjoin="Node.nid==edges.c.dest",
backref="children")
accessed_by = relationship("Group", secondary=group_access, back_populates='access_to')
def __init__(self, owner=None, type=None):
self.type = type
# self.owner = owner
def __repr__(self):
return "<{} nid:{} >".format(self.type, self.nid)
class Group(db.Model):
__tablename__ = 'groups'
group_id = Column(Integer, primary_key=True)
type = Column(String)
members = relationship("User", secondary=group_membership, back_populates="member_of")
access_to = relationship("Node", secondary=group_access, back_populates="accessed_by")
def __init__(self, name):
self.type = name
def __repr__(self):
return self.type
您希望如何查詢節點?作爲一個單獨的查詢,或者您想在提取用戶時重新加載它們嗎? –
讓我們假設一個單獨的查詢,讓我們假設給定用戶可以訪問的節點本身可能沒有父子關係。所以數據將是一棵樹,用戶可以訪問其中的不同節點。 – markand