gpt4 book ai didi

python - 如何使属性比较能够在 SQLAlchemy 中编译为 SQL 表达式?

转载 作者:太空狗 更新时间:2023-10-30 01:34:27 24 4
gpt4 key购买 nike

有两个表,表A的一列指向另一个表B的主键。

但是它们放在不同的数据库中,所以我不能用外键配置它们。

通过relationship()配置不可用,所以我手动实现了property属性。

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.过滤器(author_id=me.id))。

关系(例如连接)相关功能永远不能用于查询构建。

我可以至少在构建查询条件时使用 property 属性吗(filter()/filter_by())?

最佳答案

你仍然可以在这里使用关系。如果您坚持“延迟加载”,它将在数据库 A 中加载前导项后在数据库 B 中查询相关项。您可以在列中放置一个 ForeignKey() 指令,即使列中没有真正的指令数据库。或者您可以直接使用 primaryjoin:

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'

id = Column(BigInteger, id_seq, primary=True)
author_id = Column(BigInteger, nullable=False, index=True)
body = Column(UnicodeText, nullable=False)

author = relationship("User",
primaryjoin="foreign(Article.author_id) == User.id")

关于python - 如何使属性比较能够在 SQLAlchemy 中编译为 SQL 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19376791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com