Python SQLAlchemy一对一关系,主键作为外键
我正在将类映射到Drupal生成的现有MySQL表。我需要与表(一对一)关联,但我遇到了一个问题。两个表具有nid列。这两个字段都是主键。如果没有主键,我无法定义外键。并且关系映射不应用于主键。我的版本如下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))
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
。