SQLAlchemy 一对一关系,主键作为外键
我正在把一些类映射到已经存在的MySQL表,这些表是由Drupal生成的。我需要建立表之间的关系(是一对一的关系),但我遇到了一个问题。两个表都有一个叫做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)
谢谢。
1 个回答
29
根据评论的内容:
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)