【问题标题】:Sqlalchemy: self-referential many-to-many relationship with extra column in relationship tableSqlalchemy:在关系表中具有额外列的自引用多对多关系
【发布时间】:2020-06-09 19:21:11
【问题描述】:

我正在尝试创建一个自引用的多对多关系表,其中包含一个名为 sort_order 的额外列:

from sqlalchemy import Integer, ForeignKey, String, Column, Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.orderinglist import ordering_list

Base = declarative_base()

class Node2Node(Base):
    __tablename__ = "NodeToNode"
    left_node_id = Column(Integer, ForeignKey("Node.id"), primary_key=True)
    right_node_id = Column(Integer, ForeignKey("Node.id"), primary_key=True)
    sort_order = Column(Integer, nullable=False)


class Node(Base):
    __tablename__ = "Node"
    id = Column(Integer, primary_key=True)
    label = Column(String)

    # Many To Many with Node
    right_nodes = relationship(
        "Node",
        secondary="NodeToNode",
        primaryjoin="Node.id==NodeToNode.c.left_node_id",
        secondaryjoin="Node.id==NodeToNode.c.right_node_id",
        backref="left_nodes",
        order_by="NodeToNode.c.sort_order",
    )

    def __repr__(self):
        return f"<Node: {self.label}>"

当我运行以下脚本时,我收到一条错误消息:NOT NULL constraint failed: NodeToNode.sort_order:

from sqlalchemy import create_engine
from sqlalchemy.orm import Session

engine = create_engine("sqlite:///practice.sqlite3")
session = Session(bind=engine)

# Build tables
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)

# Load in data
nodes = [
    Node(label="A"),
    Node(label="B"),
    Node(label="C"),
    Node(label="D"),
    Node(label="E"),
]

session.add_all(nodes)
session.commit()

nodes[0].right_nodes = [nodes[3], nodes[1], nodes[2]]
nodes[0].left_nodes = [nodes[4]]

session.add_all(nodes)
session.commit()

# Display data
print("Nodes: {}".format(nodes))
print("Node A right nodes: {}".format(nodes[0].right_nodes))
print("Node A left nodes: {}".format(nodes[0].left_nodes))

session.close()

如何根据项目在列表中的索引设置此 sort_order 键?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    使用与关联对象的自引用多对多关系。

    参见https://stackoverflow.com/a/62281276/9387542的示例

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 2019-10-16
      • 2011-05-09
      • 1970-01-01
      • 2018-10-02
      • 2013-11-14
      • 1970-01-01
      • 2023-02-02
      • 2010-11-25
      相关资源
      最近更新 更多