首页 > 解决方案 > 多对多关系的SQLAlchemy问题

问题描述

我在使用 SQLAlchemy 时遇到问题。

Base = declarative_base()

node_to_node = Table("node_to_node", Base.metadata,
    Column("left_node_id", Integer, ForeignKey("node.id"), primary_key=True),
    Column("right_node_id", Integer, ForeignKey("node.id"), primary_key=True)
)

class Node(Base):
    __tablename__ = 'node'
    id = Column(Integer, primary_key=True)
    label = Column(String)
    right_nodes = relationship("Node",
                        secondary=node_to_node,
                        primaryjoin=id==node_to_node.c.left_node_id,
                        secondaryjoin=id==node_to_node.c.right_node_id,
                        backref="left_nodes"
    )

metadata = Base.metadata

engine = create_engine("postgres+psycopg2://postgres:admin@localhost:5432/test")
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)

session = sessionmaker()
session.configure(bind=engine)

s = session()

node1 = Node(label="node1")
node2 = Node(label="node2")
node3 = Node(label="node3")
node1.right_nodes.append(node2)
node1.right_nodes.append(node3)
s.add_all([node1, node2, node3])
s.commit()

我想要的是将节点 1 的所有正确节点的 ID 作为一个数组,所以在这里 [2, 3] 你知道一种允许我这样做的方法吗?

提前感谢您的帮助!

编辑 :

class NeedTag(Base):
    __tablename__ = 'need_tags'
    tag_id = Column(Integer, ForeignKey('tags.id'), primary_key=True)
    text_id = Column(Integer, ForeignKey('texts.id'), primary_key=True)

class Text(Base) : 
    __tablename__ = 'texts'

    id = Column(Integer, primary_key=True)
    text = Column(Text, nullable=False)

    need_tag = relationship("Tag", 
                            secondary="need_tags")

class Tag(Base):
    __tablename__ = 'tags'

    id = Column(Integer, primary_key=True)
    name = Column(String(), nullable=False)

我对 SQL Alchemy 合成器有疑问。例如,我定义了 Text 和 Tags 类以及 Text 和 Tags 之间的多对多关系: 要使用文本,您需要有一些必须存在的标签。

一个条件的例子是: If tag1 or tag2 : If tag3 or tag 4 : Text1 可以使用

我想这样做:

text1.need_tags = [ [tag1, tag2],[tag3, tag4] ] 

因此,要使用 text1,您至少需要第一个列表中的 1 个标签和第二个列表中的 1 个标签

但是我尝试了很多技巧,但都失败了

您知道是否可以使用 SQLAlchemy 做到这一点?或者类似的东西完成同样的事情

标签: pythonsqlpostgresqlormsqlalchemy

解决方案


推荐阅读