Python SQLAlchemy一对一关系,主键作为外键

Python SQLAlchemy一对一关系,主键作为外键,python,sqlalchemy,one-to-one,Python,Sqlalchemy,One To One,我正在将类映射到Drupal生成的现有MySQL表。我需要与表(一对一)关联,但我遇到了一个问题。两个表具有nid列。这两个字段都是主键。如果没有主键,我无法定义外键。并且关系映射不应用于主键。我的版本如下 class Node(Base): __tablename__ = 'node' nid = Column(Integer, primary_key=True) vid = Column(Integer) uuid = Column(String(128))

我正在将类映射到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)
类节点(基本):
__tablename_uu='node'
nid=列(整数,主键=True)
vid=列(整数)
uuid=列(字符串(128))
类型=列(字符串)
字段数据=关系(“nodefelddata”,order\u by=“nodefelddata.nid”,backref=“node”)
定义报告(自我):
返回“”%(self.nid、self.vid、self.uuid、self.type)
类节点场数据(基):
__tablename_uuu='节点\字段\数据'
nid=列(整数,主键=True)
类型=列(字符串,可空=False)
标题=列(字符串,可空=False)
#nid=列(整数,ForeignKey('Node.nid'))
定义报告(自我):
返回“”%(self.nid、self.vid、self.uuid、self.type)

谢谢。

根据评论:

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)
Base=declarative_Base()
类节点(基):
__tablename_uu='node'
nid=列(整数,主键=True)
uuid=列(字符串(128))
vid=列(整数)
类型=列(字符串)
#参考者。
字段\数据=关系('NodeFieldData',backref=“node”,uselist=False)
定义报告(自我):
返回“%”(self.nid、self.uuid、self.vid、self.type、self.field\u data.title)
类节点场数据(基):
__tablename_uuu='节点\字段\数据'
nid=列(整数,外键(Node.nid),主键=True)
#vid=列(整数,主键=真)
标题=列(字符串,可空=False)
定义报告(自我):
返回“”%(self.nid,self.title)

为什么不能为带有
外键的列指定一个不同的
名称
节点.nid
?类似于
node\u nid=Column(Integer,ForeignKey('node.nid'))
可能?我无法提供其他名称,因为我使用现有数据库。我无法更改结构。SA模型中的名称不会更改数据库中列的名称。不过,在数据库中,不能有两列名称相同的表。所以我的问题是:
node\u field\u data
上的列的名称是什么,它是表
node
ForeignKey
。表节点\u field\u data中的nid应该是外键。因此,您的PK也是FK。在本例中,只需执行
nid=Column(整数,ForeignKey('Node.nid'),primary_key=True)
。如果您的关系是真正的1对1,那么您还应该在其定义中添加参数
uselist=False