python过滤sql_python – 自动过滤SQLAlchemy查询的正确方法?

我刚从sqlalchemy的CRM应用程序中反思了一个非常讨厌的架构.所有表都有一个已删除的列,我想自动过滤所有标记为已删除的实体和关系.这就是我想出的:

class CustomizableQuery(Query):

"""An overridden sqlalchemy.orm.query.Query to filter entities

Filters itself by BinaryExpressions

found in :attr:`CONDITIONS`

"""

CONDITIONS = []

def __init__(self, mapper, session=None):

super(CustomizableQuery, self).__init__(mapper, session)

for cond in self.CONDITIONS:

self._add_criterion(cond)

def _add_criterion(self, criterion):

criterion = self._adapt_clause(criterion, False, True)

if self._criterion is not None:

self._criterion = self._criterion & criterion

else:

self._criterion = criterion

它的使用方式如下:

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

这给了我想要的东西,我已经过滤掉了所有已删除的联系人.我也可以使用它作为我的映射器中dynamic_loader的query_class参数 – 但是……

>有没有更好的方法来做到这一点,我真的很高兴能像我这样在查询这样的复杂类的内部.

>有没有人以不同的方式解决这个问题?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值