如何在sqlalchemy orm上重写使用django orm的代码?
list_of_filters = [Q(active=True)]
if self.proxy_anonymity:
list_of_filters.append(Q(anonymity=True))
if self.proxy_https:
list_of_filters.append(Q(https=True))
if hasattr(spider, 'bad_proxies') and spider.bad_proxies:
list_of_filters.append(~Q(ip__in=spider.bad_proxies))
proxy_filter = reduce(operator.and_, list_of_filters)
return proxy_filter
答案 0 :(得分:1)
SQLAlchemy通过在映射类上提供检测属性来使用另一种方法,如"Declare a Mapping"中所述:
在构造我们的类时,声明式将所有
Column
对象替换为称为descriptors的特殊Python访问器;这是一个称为instrumentation的过程。
然后,您可以使用SQL Expression Language来使用这些属性来构成谓词表达式。
形成实际表达式时有一些相似之处,例如分别使用按位运算符|
,&
和~
作为OR,AND和NOT。另外,SQLAlchemy提供了构造or_()
,and_()
和not_()
。总之,您应该阅读ORM教程中的"Querying"。
因此,如果您的模型类例如是Proxy
,则代码看起来像
# Note that it is redundant to compare a boolean column with a boolean value.
# Just use the value of the column itself.
list_of_filters = [Proxy.active]
if self.proxy_anonymity:
# Again, use a boolean column as is.
list_of_filters.append(Proxy.anonymity)
if self.proxy_https:
list_of_filters.append(Proxy.https)
if hasattr(spider, 'bad_proxies') and spider.bad_proxies:
list_of_filters.append(Proxy.ip.in_(spider.bad_proxies))
proxy_filter = and_(*list_of_filters)
return proxy_filter