def _post_init(self): if logging.is_info_enabled(self.logger): self.logger.info(str(self) + " setup primary join %s" % self.primaryjoin) self.logger.info(str(self) + " setup secondary join %s" % self.secondaryjoin) self.logger.info(str(self) + " synchronize pairs [%s]" % ",".join(["(%s => %s)" % (l, r) for l, r in self.synchronize_pairs])) self.logger.info(str(self) + " secondary synchronize pairs [%s]" % ",".join(["(%s => %s)" % (l, r) for l, r in self.secondary_synchronize_pairs or []])) self.logger.info(str(self) + " local/remote pairs [%s]" % ",".join(["(%s / %s)" % (l, r) for l, r in self.local_remote_pairs])) self.logger.info(str(self) + " relation direction %s" % self.direction) if self.uselist is None and self.direction is MANYTOONE: self.uselist = False if self.uselist is None: self.uselist = True if not self.viewonly: self._dependency_processor = dependency.create_dependency_processor(self) # primary property handler, set up class attributes if self.is_primary(): # if a backref name is defined, set up an extension to populate # attributes in the other direction if self.backref is not None: self.attributeext = self.backref.get_extension() if self.backref is not None: self.backref.compile(self) elif not mapper.class_mapper(self.parent.class_, compile=False)._get_property(self.key, raiseerr=False): raise exceptions.ArgumentError("Attempting to assign a new relation '%s' to a non-primary mapper on class '%s'. New relations can only be added to the primary mapper, i.e. the very first mapper created for class '%s' " % (self.key, self.parent.class_.__name__, self.parent.class_.__name__)) super(PropertyLoader, self).do_init()
def _post_init(self): if logging.is_info_enabled(self.logger): self.logger.info(str(self) + " setup primary join " + str(self.primaryjoin)) self.logger.info(str(self) + " setup polymorphic primary join " + str(self.polymorphic_primaryjoin)) self.logger.info(str(self) + " setup secondary join " + str(self.secondaryjoin)) self.logger.info(str(self) + " setup polymorphic secondary join " + str(self.polymorphic_secondaryjoin)) self.logger.info(str(self) + " foreign keys " + str([str(c) for c in self.foreign_keys])) self.logger.info(str(self) + " remote columns " + str([str(c) for c in self.remote_side])) self.logger.info(str(self) + " relation direction " + (self.direction is sync.ONETOMANY and "one-to-many" or (self.direction is sync.MANYTOONE and "many-to-one" or "many-to-many"))) if self.uselist is None and self.direction is sync.MANYTOONE: self.uselist = False if self.uselist is None: self.uselist = True if not self.viewonly: self._dependency_processor = dependency.create_dependency_processor(self) # primary property handler, set up class attributes if self.is_primary(): # if a backref name is defined, set up an extension to populate # attributes in the other direction if self.backref is not None: self.attributeext = self.backref.get_extension() if self.backref is not None: self.backref.compile(self) elif not sessionlib.attribute_manager.is_class_managed(self.parent.class_, self.key): raise exceptions.ArgumentError("Attempting to assign a new relation '%s' to a non-primary mapper on class '%s'. New relations can only be added to the primary mapper, i.e. the very first mapper created for class '%s' " % (self.key, self.parent.class_.__name__, self.parent.class_.__name__)) super(PropertyLoader, self).do_init()
def flush(self, session, objects=None): # this context will track all the objects we want to save/update/delete, # and organize a hierarchical dependency structure. it also handles # communication with the mappers and relationships to fire off SQL # and synchronize attributes between related objects. echo = logging.is_info_enabled(self.logger) flush_context = UOWTransaction(self, session) # create the set of all objects we want to operate upon if objects is not None: # specific list passed in objset = util.Set(objects) else: # or just everything objset = util.Set(self.identity_map.values()).union(self.new) # detect persistent objects that have changes dirty = self.locate_dirty() # store objects whose fate has been decided processed = util.Set() # put all saves/updates into the flush context. detect orphans and throw them into deleted. for obj in self.new.union(dirty).intersection(objset).difference( self.deleted): if obj in processed: continue if object_mapper(obj)._is_orphan(obj): for c in [obj] + list( object_mapper(obj).cascade_iterator('delete', obj)): if c in processed: continue flush_context.register_object(c, isdelete=True) processed.add(c) else: flush_context.register_object(obj) processed.add(obj) # put all remaining deletes into the flush context. for obj in self.deleted: if (objset is not None and not obj in objset) or obj in processed: continue flush_context.register_object(obj, isdelete=True) trans = session.create_transaction(autoflush=False) flush_context.transaction = trans try: flush_context.execute() except: trans.rollback() raise trans.commit() flush_context.post_exec()
def flush(self, session, objects=None): # this context will track all the objects we want to save/update/delete, # and organize a hierarchical dependency structure. it also handles # communication with the mappers and relationships to fire off SQL # and synchronize attributes between related objects. echo = logging.is_info_enabled(self.logger) flush_context = UOWTransaction(self, session) # create the set of all objects we want to operate upon if objects is not None: # specific list passed in objset = util.Set(objects) else: # or just everything objset = util.Set(self.identity_map.values()).union(self.new) # detect persistent objects that have changes dirty = self.locate_dirty() # store objects whose fate has been decided processed = util.Set() # put all saves/updates into the flush context. detect orphans and throw them into deleted. for obj in self.new.union(dirty).intersection(objset).difference(self.deleted): if obj in processed: continue if object_mapper(obj)._is_orphan(obj): for c in [obj] + list(object_mapper(obj).cascade_iterator('delete', obj)): if c in processed: continue flush_context.register_object(c, isdelete=True) processed.add(c) else: flush_context.register_object(obj) processed.add(obj) # put all remaining deletes into the flush context. for obj in self.deleted: if (objset is not None and not obj in objset) or obj in processed: continue flush_context.register_object(obj, isdelete=True) trans = session.create_transaction(autoflush=False) flush_context.transaction = trans try: flush_context.execute() except: trans.rollback() raise trans.commit() flush_context.post_exec()
def _post_init(self): if logging.is_info_enabled(self.logger): self.logger.info( str(self) + " setup primary join " + str(self.primaryjoin)) self.logger.info( str(self) + " setup polymorphic primary join " + str(self.polymorphic_primaryjoin)) self.logger.info( str(self) + " setup secondary join " + str(self.secondaryjoin)) self.logger.info( str(self) + " setup polymorphic secondary join " + str(self.polymorphic_secondaryjoin)) self.logger.info( str(self) + " foreign keys " + str([str(c) for c in self.foreign_keys])) self.logger.info( str(self) + " remote columns " + str([str(c) for c in self.remote_side])) self.logger.info( str(self) + " relation direction " + (self.direction is sync.ONETOMANY and "one-to-many" or (self.direction is sync.MANYTOONE and "many-to-one" or "many-to-many"))) if self.uselist is None and self.direction is sync.MANYTOONE: self.uselist = False if self.uselist is None: self.uselist = True if not self.viewonly: self._dependency_processor = dependency.create_dependency_processor( self) # primary property handler, set up class attributes if self.is_primary(): # if a backref name is defined, set up an extension to populate # attributes in the other direction if self.backref is not None: self.attributeext = self.backref.get_extension() if self.backref is not None: self.backref.compile(self) elif not sessionlib.attribute_manager.is_class_managed( self.parent.class_, self.key): raise exceptions.ArgumentError( "Attempting to assign a new relation '%s' to a non-primary mapper on class '%s'. New relations can only be added to the primary mapper, i.e. the very first mapper created for class '%s' " % (self.key, self.parent.class_.__name__, self.parent.class_.__name__)) super(PropertyLoader, self).do_init()