python - 使用 SqlAlchemy 在 __init__ 上一致应用东西

标签 python sqlalchemy

假设我有这样的东西:

class Tab(Base):
  a = 'a'
  b = 'b'
  c = 'c'

  def __init__(self):
    self.c_a = DBSession.query(Table2).filter(Table2.a == self.a).all()

self.c_a 似乎只应用于我插入的项目。我想确保 __init__ 中指定的操作(这只是一个示例,可能通过 relationship() 更好地完成,但发挥你的想象力)适用于所有对象,包括 SA 从我的数据库中查询的对象。有人知道怎么做吗?

我觉得我可能误解了什么,如果是的话请指正。

最佳答案

从模型内部引用数据库是一种抽象泄漏;模型不必知道它们可能驻留的持久性的细节;它们可能根本不持久(毕竟它们是模型,并且可能用于任何类型的计算。)

当尝试与其他实体建立关联时,您应该始终使用 relationship(),无论是否存在底层持久性存储,它都可以正常工作。更重要的是,当您使用 SQLAlchemy 进行动态生成的查询时,关系很有用;在模型方法中执行查询不允许这种灵 active 。

如果您确定需要在模型层(而不是 Controller 层,通常应该这样做)对 session 进行操作,那么您肯定不应该使用全局 session 实例;始终从对象本身计算 session :

class MyModel(Base):
    def frobnicate(self):
        session = sqlalchemy.orm.Session.object_session(self)
        if session is None:
            raise ValueError("not connected to a session")
        session.query(...)

关于python - 使用 SqlAlchemy 在 __init__ 上一致应用东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6886608/

相关文章:

python - 使用 scipy least_squares 时出现 ValueError

python - 无法 pip 安装 mysql-python

python - 如何从 Django URL 更改语言?

python - 将一个类映射到 SQLAlchemy 中不同数据库中的两个表

python - 更改蒸馏器记录器

python - 并行化令人尴尬的可并行化生成器的简单方法

python - Login_Required 装饰器在 django 中无法正常工作

flask - 属性错误: '_Option' object has no attribute '_sa_instance_state' in flask

python - 通过反射用 python 填充复杂的 SQL 数据库?

python - 从 m2m 表中删除行时,sqlalchemy CompileError 未使用的列名