Python 自动过滤SQLAlchemy查询的正确方法?

Python 自动过滤SQLAlchemy查询的正确方法?,python,sqlalchemy,sugarcrm,Python,Sqlalchemy,Sugarcrm,我刚刚从一个使用sqlalchemy的CRM应用程序中反思了一个非常糟糕的模式。所有的表都有一个deleted列,我想自动过滤所有标记为deleted的实体和关系。以下是我的想法: 它是这样使用的: class UndeletedContactQuery(CustomizableQuery): CONDITIONS = [contacts.c.deleted != True] def by_email(self, email_address): return

我刚刚从一个使用sqlalchemy的CRM应用程序中反思了一个非常糟糕的模式。所有的表都有一个deleted列,我想自动过滤所有标记为deleted的实体和关系。以下是我的想法:


它是这样使用的:

class UndeletedContactQuery(CustomizableQuery):
    CONDITIONS = [contacts.c.deleted != True]

    def by_email(self, email_address):
        return EmailInfo.query.by_module_and_address('Contacts', email_address).contact

    def by_username(self, uname):
        return self.filter_by(twod_username_c=uname).one()

class Contact(object):
    query = session.query_property(UndeletedContactQuery)

Contact.query.by_email('someone@some.com')
EmailInfo是映射到电子邮件和其他与其相关的模块之间的联接表的类

下面是一个映射器示例:

contacts_map = mapper(Contact, join(contacts, contacts_cstm), {
    '_emails': dynamic_loader(EmailInfo,
                              foreign_keys=[email_join.c.bean_id],
                              primaryjoin=contacts.c.id==email_join.c.bean_id,
                              query_class=EmailInfoQuery),
    })

class EmailInfoQuery(CustomizableQuery):

    CONDITIONS = [email_join.c.deleted != True]
    # More methods here

这给了我想要的,因为我已经过滤掉了所有删除的联系人。我也可以将其用作映射器中动态加载程序的查询类参数-但是

  • 有没有更好的方法可以做到这一点,我真的不喜欢像我这样在复杂类(比如查询)的内部进行研究
  • 有没有人以不同的方式解决了这个问题,他们可以分享

  • 您可以映射到一个选择。像这样:

    mapper(EmailInfo, select([email_join], email_join.c.deleted == False))
    

    我想看看是否有可能为筛选出删除元素的表创建视图,然后您可以直接映射到该视图而不是基础表,至少用于查询操作。但是我自己从来没有试过

    很好,我不知道!我只是试着这样做(在另一张桌子上),但没有成功。我得到:TypeError:“Table”对象不可编辑知道为什么吗?我的错误是,要选择的第一个参数是列/类似于表的对象的列表,所以email\u join应该在列表中。我会修好的。
    mapper(EmailInfo, select([email_join], email_join.c.deleted == False))