gpt4 book ai didi

python - SQLAlchemy - 如何在没有类引用的查询过程中过滤相关类的属性?

转载 作者:太空宇宙 更新时间:2023-11-03 18:59:03 25 4
gpt4 key购买 nike

我很难回答这个问题的标题,所以让我列出代码:

文件A:

class SomeClass(Base):
__tablename__ = 'some_classes'
id = Column(Integer, primary_key=True)
my_awesome_property = Column(Unicode(255))
other_class = relationship('OtherClass', backref='some_class', uselist=False)

文件B:

class OtherClass(Base):
__tablename__ = 'other_classes'
id = Column(Integer, primary_key=True)
my_sweet_property = Column(Unicode(255))
some_class_id = Column(ForeignKey('some_classes.id'))

现在,在许多情况下,我会从包含一些函数的“高阶”文件中引用这两个文件,如下所示:

高阶文件:

from model.alpha import SomeClass
from model.bravo import OtherClass
from sqlalchemy.orm import sessionmaker

session = sessionmaker(bind=some_engine)()

def some_random_query():
return session.query(SomeClass).join(OtherClass).filter(OtherClass.my_sweet_property=='Mike Bayer\'s cat speaks SQL.').first()

所以这很正常,没有什么问题......直到......我决定将一个函数放入文件 A 等较低级别的文件之一(并避免循环导入)

返回文件A:

# pretend I imported a session here
def frustrating_situation():
session.query(SomeClass).join(SomeClass.other_class).filter(SomeClass.other_class.my_sweet_property=='Get ready for an exception!').first()

这会将这个坏男孩扔到这里:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with SomeClass.other_class has an attribute 'my_sweet_property'

现在,鉴于我对 SQLAlchemy 内部结构的了解,我认为这是有道理的,但我也认为从 API 的角度来看,该语句应该确实有效。

这是我解决这个问题的方法:

session.query(SomeClass).join(SomeClass.other_class).filter(SomeClass.other_class.property.mapper.c.my_sweet_property == 'verbose, yet it works as desired').first()

毕竟,我的问题真的很简单:有人知道更好/更惯用/正确/不那么肮脏的方式吗?

欢迎提出建议。

旁注

对于任何想知道的人:

“为什么不直接导入您想要引用以进行连接/过滤操作的类?”

有几个原因可能导致您不希望/无法将该类导入到您正在编写查询的模块中。

  • 您已将类定义拆分到多个文件中,并决定严格不跨同一级别的模块导入来避免循环导入
  • 您决定放置对当前模块中当前未定义或导入的 1 个或多个类进行操作的函数,并且不希望导入它们,因为它们在模块中没有因任何其他原因而使用(再次参见原因 1) )。

最佳答案

SomeClass.other_class.my_sweet_property

在 sqlalchemy 中不起作用。抱歉。

您在此 .filter() 子句中引用了 OtherClass。如何得到这个名字是你的事,但从每个陈述的含义和论点的来源的角度来看,最清晰的方法仍然是导入东西。

编辑:当您尝试直接从模块中导入名称而不是仅导入模块时,会出现循环导入问题的常见原因。如果您将代码变成如下所示:

from foo import Bar
def baz():
Bar.quux()

如果 foo 也尝试导入此模块(例如,因为它想使用 baz),那么您将遇到导入问题。

通过仅导入模块来修复它:

import foo
def baz()
foo.Bar.quux()

由于 foo.Bar 是稍后解析的,因此只有在调用 baz() 时,您在导入此模块时才不会遇到任何问题 em>,因为它实际上并不尝试使用它导入的任何模块的内容。

关于python - SQLAlchemy - 如何在没有类引用的查询过程中过滤相关类的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16503442/

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