有两个表,表 A 的一列指向另一个表 B 的主键。
但是它们被放置在不同的数据库中,所以我不能用外键配置它们。
配置 viarelationship()
不可用,所以我手动实现了属性属性。
class User(Base):
__tablename__ = 'users'
id = Column(BigInteger, id_seq, primary=True)
name = Column(Unicode(256))
class Article(Base):
__tablename__ = 'articles'
__bind_key__ = 'another_engine'
# I am using custom session configures bind
# each mappers to multiple database engines via this attribute.
id = Column(BigInteger, id_seq, primary=True)
author_id = Column(BigInteger, nullable=False, index=True)
body = Column(UnicodeText, nullable=False)
@property
def author(self):
_session = object_session(self)
return _session.query(User).get(self.author_id)
@author.setter
def author(self, user):
if not isinstance(user, User):
raise TypeError('user must be a instance of User')
self.author_id = user.id
此代码适用于简单的操作。但它会导致脏查询使 SQLAlchemy 的功能毫无意义。
relationship()
如果通过(例如query.filter(author=me)
)搞砸了(例如)配置代码,代码会很简单query.filter(author_id=me.id)
。
关系(例如连接)相关功能永远不能用于查询构建。
我至少可以在构建查询条件(filter()/filter_by()
)中使用属性属性吗?