我已经编写了下面的示例代码来为我正在编写的ACL系统构建一个搜索索引。本例中的查询将重新返回分配了任何给定ACL的所有对象。但是我需要一个查询/过滤器来返回分配了所有acl的对象。在
感谢任何帮助。在
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import backref
from sqlalchemy import create_engine
from sqlalchemy import ForeignKey
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy import Column
_db_uri = "sqlite:////tmp/test.sql"
Base = declarative_base()
engine = create_engine(_db_uri, echo=False)
Session = sessionmaker(bind=engine)
class IndexObject(Base):
""" Index object. """
__tablename__ = 'objects'
id = Column(Integer, primary_key=True)
name = Column(String(128), unique=True, nullable=True)
acls = relationship('IndexObjectACL',
cascade = "all,delete",
backref='objects',
lazy='dynamic')
def __repr__(self):
_repr_ =("<IndexObject (name='%s')>" % (self.name))
return _repr_
class IndexObjectACL(Base):
""" Index object ACL. """
__tablename__ = 'acls'
id = Column(Integer, primary_key=True)
value = Column(String(128), nullable=False)
oid = Column(Integer, ForeignKey('objects.id'))
def __repr__(self):
__repr__ = ("<IndexObjectACL (value='%s')>" % (self.value))
return __repr__
object_list = [
"object1",
"object2",
"object3",
]
acl_list = {
"object1" : [
"view",
"edit",
"enable",
"delete",
],
"object2" : [
"view",
"edit",
],
"object3" : [
"enable",
"delete",
],
}
Base.metadata.create_all(engine)
session = Session()
for o in object_list:
acls = []
for acl in acl_list[o]:
a = IndexObjectACL(value=acl)
acls.append(a)
index_object = IndexObject(name=o, acls=acls)
session.add(index_object)
session.commit()
search_acls = [ "enable", "delete" ]
q = session.query(IndexObject)
q = q.join(IndexObject.acls).filter(IndexObjectACL.value.in_(search_acls))
print(q.all())
session.close()
我可以试着解释一下,但我对SQL炼金术和SQL还不太熟悉。所以我可能解释错了。。。join()根据IndexObject和IndexObjectACL表的关系将它们连接起来,这将导致一个新的查询。此查询用于为要使用filter()匹配的每个ACL创建一个新查询。最后,我们使用intersect()(SQL INTERSECT)来获取所有查询中出现的所有IndexObject。经过一些测试后,这似乎是一种快速搜索已分配了所有acl的对象的方法。它也很像Python。在
我认为这可能是一个使用division-的机会。IndexObjectACL除以searchACL应生成具有所有searchACL的IndexObject。换言之,对于不存在不在其IndexObjectACL中的searchACL的查询:
此查询的结果是
^{pr2}$如果你加上
为了证明不返回部分匹配,它仍然只返回对象1和对象3。在
您最初的“have any”查询也可以重写为在SQL语言中使用semijoin,或{}:
相关问题 更多 >
编程相关推荐