⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dependency.py

📁 SQLAlchemy. 经典的Python ORM框架。学习必看。
💻 PY
📖 第 1 页 / 共 2 页
字号:
        source = state        dest = child        if dest is None or (not self.post_update and uowcommit.is_deleted(dest)):            return        self._verify_canload(child)        self.syncrules.execute(source, dest, source, child, clearkeys)class DetectKeySwitch(DependencyProcessor):    """a special DP that works for many-to-one relations, fires off for    child items who have changed their referenced key."""    no_dependencies = True    def register_dependencies(self, uowcommit):        uowcommit.register_processor(self.parent, self, self.mapper)    def preprocess_dependencies(self, task, deplist, uowcommit, delete=False):        # for non-passive updates, register in the preprocess stage        # so that mapper save_obj() gets a hold of changes        if not delete and not self.passive_updates:            self._process_key_switches(deplist, uowcommit)    def process_dependencies(self, task, deplist, uowcommit, delete=False):        # for passive updates, register objects in the process stage        # so that we avoid ManyToOneDP's registering the object without        # the listonly flag in its own preprocess stage (results in UPDATE)        # statements being emitted        if not delete and self.passive_updates:            self._process_key_switches(deplist, uowcommit)    def _process_key_switches(self, deplist, uowcommit):        switchers = util.Set([s for s in deplist if self._pks_changed(uowcommit, s)])        if switchers:            # yes, we're doing a linear search right now through the UOW.  only            # takes effect when primary key values have actually changed.            # a possible optimization might be to enhance the "hasparents" capability of            # attributes to actually store all parent references, but this introduces            # more complicated attribute accounting.            for s in [elem for elem in uowcommit.session.identity_map.all_states()                if issubclass(elem.class_, self.parent.class_) and                    self.key in elem.dict and                    elem.dict[self.key]._state in switchers                ]:                uowcommit.register_object(s, listonly=self.passive_updates)                self.syncrules.execute(s.dict[self.key]._state, s, None, None, False)class ManyToOneDP(DependencyProcessor):    def __init__(self, prop):        DependencyProcessor.__init__(self, prop)        self.mapper._dependency_processors.append(DetectKeySwitch(prop))    def register_dependencies(self, uowcommit):        if self.post_update:            if not self.is_backref:                stub = MapperStub(self.parent, self.mapper, self.key)                uowcommit.register_dependency(self.mapper, stub)                uowcommit.register_dependency(self.parent, stub)                uowcommit.register_processor(stub, self, self.parent)        else:            uowcommit.register_dependency(self.mapper, self.parent)            uowcommit.register_processor(self.mapper, self, self.parent)    def process_dependencies(self, task, deplist, uowcommit, delete = False):        #print self.mapper.mapped_table.name + " " + self.key + " " + repr(len(deplist)) + " process_dep isdelete " + repr(delete) + " direction " + repr(self.direction)        if delete:            if self.post_update and not self.cascade.delete_orphan and not self.passive_deletes=='all':                # post_update means we have to update our row to not reference the child object                # before we can DELETE the row                for state in deplist:                    self._synchronize(state, None, None, True, uowcommit)                    (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=self.passive_deletes)                    if added or unchanged or deleted:                        self._conditional_post_update(state, uowcommit, deleted + unchanged + added)        else:            for state in deplist:                (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=True)                if added or deleted or unchanged:                    for child in added:                        self._synchronize(state, child, None, False, uowcommit)                    self._conditional_post_update(state, uowcommit, deleted + unchanged + added)    def preprocess_dependencies(self, task, deplist, uowcommit, delete = False):        #print self.mapper.mapped_table.name + " " + self.key + " " + repr(len(deplist)) + " PRE process_dep isdelete " + repr(delete) + " direction " + repr(self.direction)        if self.post_update:            return        if delete:            if self.cascade.delete:                for state in deplist:                    (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=self.passive_deletes)                    if deleted or unchanged:                        for child in deleted + unchanged:                            if child is not None and self.hasparent(child) is False:                                uowcommit.register_object(child, isdelete=True)                                for c, m in self.mapper.cascade_iterator('delete', child):                                    uowcommit.register_object(c._state, isdelete=True)        else:            for state in deplist:                uowcommit.register_object(state)                if self.cascade.delete_orphan:                    (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=self.passive_deletes)                    if deleted:                        for child in deleted:                            if self.hasparent(child) is False:                                uowcommit.register_object(child, isdelete=True)                                for c, m in self.mapper.cascade_iterator('delete', child):                                    uowcommit.register_object(c._state, isdelete=True)    def _synchronize(self, state, child, associationrow, clearkeys, uowcommit):        source = child        dest = state        if dest is None or (not self.post_update and uowcommit.is_deleted(dest)):            return        self._verify_canload(child)        self.syncrules.execute(source, dest, dest, child, clearkeys)class ManyToManyDP(DependencyProcessor):    def register_dependencies(self, uowcommit):        # many-to-many.  create a "Stub" mapper to represent the        # "middle table" in the relationship.  This stub mapper doesnt save        # or delete any objects, but just marks a dependency on the two        # related mappers.  its dependency processor then populates the        # association table.        stub = MapperStub(self.parent, self.mapper, self.key)        uowcommit.register_dependency(self.parent, stub)        uowcommit.register_dependency(self.mapper, stub)        uowcommit.register_processor(stub, self, self.parent)    def process_dependencies(self, task, deplist, uowcommit, delete = False):        #print self.mapper.mapped_table.name + " " + self.key + " " + repr(len(deplist)) + " process_dep isdelete " + repr(delete) + " direction " + repr(self.direction)        connection = uowcommit.transaction.connection(self.mapper)        secondary_delete = []        secondary_insert = []        secondary_update = []        if self.prop._reverse_property:            reverse_dep = getattr(self.prop._reverse_property, '_dependency_processor', None)        else:            reverse_dep = None        if delete:            for state in deplist:                (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=self.passive_deletes)                if deleted or unchanged:                    for child in deleted + unchanged:                        if child is None or (reverse_dep and (reverse_dep, "manytomany", child, state) in uowcommit.attributes):                            continue                        associationrow = {}                        self._synchronize(state, child, associationrow, False, uowcommit)                        secondary_delete.append(associationrow)                        uowcommit.attributes[(self, "manytomany", state, child)] = True        else:            for state in deplist:                (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key)                if added or deleted:                    for child in added:                        if child is None or (reverse_dep and (reverse_dep, "manytomany", child, state) in uowcommit.attributes):                            continue                        associationrow = {}                        self._synchronize(state, child, associationrow, False, uowcommit)                        uowcommit.attributes[(self, "manytomany", state, child)] = True                        secondary_insert.append(associationrow)                    for child in deleted:                        if child is None or (reverse_dep and (reverse_dep, "manytomany", child, state) in uowcommit.attributes):                            continue                        associationrow = {}                        self._synchronize(state, child, associationrow, False, uowcommit)                        uowcommit.attributes[(self, "manytomany", state, child)] = True                        secondary_delete.append(associationrow)                if not self.passive_updates and unchanged and self._pks_changed(uowcommit, state):                    for child in unchanged:                        associationrow = {}                        self.syncrules.update(associationrow, state, child, "old_")                        secondary_update.append(associationrow)        if secondary_delete:            secondary_delete.sort()            # TODO: precompile the delete/insert queries?            statement = self.secondary.delete(sql.and_(*[c == sql.bindparam(c.key, type_=c.type) for c in self.secondary.c if c.key in associationrow]))            result = connection.execute(statement, secondary_delete)            if result.supports_sane_multi_rowcount() and result.rowcount != len(secondary_delete):                raise exceptions.ConcurrentModificationError("Deleted rowcount %d does not match number of secondary table rows deleted from table '%s': %d" % (result.rowcount, self.secondary.description, len(secondary_delete)))        if secondary_update:            statement = self.secondary.update(sql.and_(*[c == sql.bindparam("old_" + c.key, type_=c.type) for c in self.secondary.c if c.key in associationrow]))            result = connection.execute(statement, secondary_update)            if result.supports_sane_multi_rowcount() and result.rowcount != len(secondary_update):                raise exceptions.ConcurrentModificationError("Updated rowcount %d does not match number of secondary table rows updated from table '%s': %d" % (result.rowcount, self.secondary.description, len(secondary_update)))        if secondary_insert:            statement = self.secondary.insert()            connection.execute(statement, secondary_insert)    def preprocess_dependencies(self, task, deplist, uowcommit, delete = False):        #print self.mapper.mapped_table.name + " " + self.key + " " + repr(len(deplist)) + " preprocess_dep isdelete " + repr(delete) + " direction " + repr(self.direction)        if not delete:            for state in deplist:                (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=True)                if deleted:                    for child in deleted:                        if self.cascade.delete_orphan and self.hasparent(child) is False:                            uowcommit.register_object(child, isdelete=True)                            for c, m in self.mapper.cascade_iterator('delete', child):                                uowcommit.register_object(c._state, isdelete=True)    def _synchronize(self, state, child, associationrow, clearkeys, uowcommit):        if associationrow is None:            return        self._verify_canload(child)        self.syncrules.execute(None, associationrow, state, child, clearkeys)class AssociationDP(OneToManyDP):    def __init__(self, *args, **kwargs):        super(AssociationDP, self).__init__(*args, **kwargs)        self.cascade.delete = True        self.cascade.delete_orphan = Trueclass MapperStub(object):    """Pose as a Mapper representing the association table in a    many-to-many join, when performing a ``flush()``.    The ``Task`` objects in the objectstore module treat it just like    any other ``Mapper``, but in fact it only serves as a dependency    placeholder for the many-to-many update task.    """    __metaclass__ = util.ArgSingleton    def __init__(self, parent, mapper, key):        self.mapper = mapper        self.base_mapper = self        self.class_ = mapper.class_        self._inheriting_mappers = []    def polymorphic_iterator(self):        return iter([self])    def _register_dependencies(self, uowcommit):        pass    def _save_obj(self, *args, **kwargs):        pass    def _delete_obj(self, *args, **kwargs):        pass    def primary_mapper(self):        return self

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -