【发布时间】:2015-02-11 12:11:04
【问题描述】:
我正在使用 SQLAlchemy 映射具有多个“假”多对多关系案例的数据库。我的意思是,假设我有以下对象:
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
addresses = relationship('Address', secondary='user_address')
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
users = relationship('User', secondary='user_address')
class UserAddressLink(Base):
__tablename__ = 'user_address'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('user.id'))
address_id = Column(Integer, ForeignKey('address.id'))
所以,一个简单的多对多关系,对吗?但是有一个问题:它从来没有打算是多对多的。这实际上是一个一对一的关系,有人出于某种原因决定在数据库中设计这样的关系。每个User 只有一个Address,反之亦然。我无法控制数据库设计(事实上,我只是从这个数据库中读取而不是在上面写)所以我无法改变它。
在 SQLAlchemy 上是否有处理此问题的标准方法?它自动假定这是一个多对多关系,并将 User.adresses 和 Address.users 视为列表。
我处理它的方式是创建属性:
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
_addresses = relatioship('Address', secondary='user_address')
@property
def address(self):
return self.addresses[0] if len(self.addresses) > 0 else None
@address.setter
def address(self, value):
self.addresses = [value]
等等。
这是解决此问题的最佳方法还是有其他解决方法?
【问题讨论】:
标签: database-design sqlalchemy many-to-many