【问题标题】:SQLAlchemy one-to-one relation, primary as foreign keySQLAlchemy 一对一关系,主作为外键
【发布时间】:2014-08-19 23:16:37
【问题描述】:

我将类映射到 Drupal 生成的现有 MySQL 表。我需要与表格相关联(一对一),但我遇到了问题。两个表都有列 nid。这两个字段都是主键。如果没有主键,我无法定义外键。并且关系映射不适用于主键。我的版本在下面。

class Node(Base):
    __tablename__ = 'node'
    nid = Column(Integer, primary_key=True)
    vid = Column(Integer)
    uuid = Column(String(128))
    type = Column(String)

    field_data = relationship("NodeFieldData", order_by="NodeFieldData.nid", backref="node")

    def __repr__(self):
        return "<User(nid='%s', vid='%s', uuid='%s', type='%s')>" % (self.nid, self.vid, self.uuid, self.type)

class NodeFieldData(Base):
    __tablename__ = 'node_field_data'
    nid = Column(Integer, primary_key=True)
    type = Column(String, nullable=False)
    title = Column(String, nullable=False)
    #nid = Column(Integer, ForeignKey('Node.nid'))

    def __repr__(self):
        return "<User(nid='%s', vid='%s', uuid='%s', type='%s')>" % (self.nid, self.vid, self.uuid, self.type)

谢谢。

【问题讨论】:

  • 为什么你不能给具有ForeignKeyNode.nid 的列提供不同的name?可能是node_nid = Column(Integer, ForeignKey('Node.nid')) 之类的?
  • 我不能给另一个名字,因为我使用现有的数据库。我不能改变结构。
  • SA 模型中的 name 将不会更改数据库中列的名称。尽管如此,在数据库上,您也不能拥有包含两列同名的表。所以我的问题是:node_field_data 上的列名称是什么,它是表 nodeForeignKey
  • 表node_field_data中的nid应该是外键。
  • 所以你的PK也是FK。在这种情况下,只需执行nid = Column(Integer, ForeignKey('Node.nid'), primary_key=True)。如果您的关系确实是1-to-1,那么您还应该在其定义中添加一个参数uselist=False

标签: python sqlalchemy one-to-one


【解决方案1】:

根据cmets:

nid = Column(Integer, ForeignKey(Node.nid), primary_key=True)

整个解决方案是:

Base = declarative_base()
class Node(Base):
    __tablename__ = 'node'
    nid = Column(Integer, primary_key=True)
    uuid = Column(String(128))
    vid = Column(Integer)
    type = Column(String)

    # Refferer.
    field_data = relationship('NodeFieldData', backref="node", uselist=False)

    def __repr__(self):
        return "<Node(nid='%s', uuid='%s', vid='%s', type='%s', title='%s')>" % (self.nid, self.uuid, self.vid, self.type, self.field_data.title)

class NodeFieldData(Base):
    __tablename__ = 'node_field_data'
    nid = Column(Integer, ForeignKey(Node.nid), primary_key=True)
    #vid = Column(Integer, primary_key=True)
    title = Column(String, nullable=False)

    def __repr__(self):
        return "<Node(nid='%s', title='%s')>" % (self.nid, self.title)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 2021-09-27
    • 2014-09-20
    • 1970-01-01
    • 2020-01-08
    • 2017-05-24
    • 2016-12-02
    • 1970-01-01
    相关资源
    最近更新 更多