def __init__(self, relation): self.relation = self.rel = relation self.link_table = link_table_name(constants.MODES[self.rel.mode], self.rel.model.tablename(), self.rel.identifier, self.rel.related_model.tablename()) self.nullable = False # nullable not allowed on many-related fields?
def trigger_uniqueness(mode, ptable, rtable, pkeycol, lpkeycol, lrkeycol): '''Prevents inserts of exact equals into a M2M link table.''' trigger_name = "fkiuniq__" + link_table_name(mode, ptable, pkeycol, rtable) return """ CREATE TRIGGER %s BEFORE INSERT ON %s FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'insert on table "%s" violates foreign key constraint "%s"') WHERE (SELECT id FROM %s WHERE %s_id = NEW.%s_id AND %s_id = NEW.%s_id) IS NOT NULL; END """ %( trigger_name, link_table_name(mode, ptable, pkeycol, rtable), link_table_name(mode, ptable, pkeycol, rtable), trigger_name, link_table_name(mode, ptable, pkeycol, rtable), lpkeycol, lpkeycol, lrkeycol, lrkeycol )
def render(self): if self.relation.mode in (M2M, O2O): # Many related mode link_table = link_table_name( MODES[self.relation.mode], self.relation.model.tablename(), self.relation.identifier, self.relation.related_model.tablename() ) return "%s AS %s LEFT OUTER JOIN %s ON %s.id = %s.%s_id LEFT OUTER JOIN %s AS %s ON %s.%s_id = %s.id" % ( self.get_left_side(), self.get_left_side_alias(), link_table, self.get_left_side_alias(), link_table, self.rel._get_other_identifier(self.identifier), self.get_right_side(), self.get_right_side_alias(), link_table, self.ident, self.get_right_side_alias() ) else: # Foreign key mode if self.rel.is_reverse_by_identifier(self.ident): base_table = self.get_right_side_alias() fk_table = self.get_left_side_alias() else: base_table = self.get_left_side_alias() fk_table = self.get_right_side_alias() model_fields = self.rel.model.fields() fk_field_on_base_table = model_fields.get( self.rel.identifier, model_fields.get(self.rel.reverse_identifier) ) assert (fk_field_on_base_table is not None), (self.ident, self.rel.model.fields(), self.rel.related_model.fields()) return "%s AS %s LEFT OUTER JOIN %s AS %s ON %s.%s = %s.id" % ( self.get_left_side(), self.get_left_side_alias(), self.get_right_side(), self.get_right_side_alias(), base_table, fk_field_on_base_table.column_name, fk_table )
def __init__(self, relation, master, identifier, slaves, db=None): self.relation = relation self.master = master self.identifier = identifier # slaves is a list of instances, whose relation to self.master will be # deleted from the linker table. If slaves is empty, all relations # that self.master has to other instances in this linker table, will be # deleted. self.slaves = slaves self.db = db or connection.connect() self.table = link_table_name(MODES[self.relation.mode], self.relation.model.tablename(), self.relation.identifier, self.relation.related_model.tablename() )
def __init__(self, relation, master, identifier, slaves, db=None): self.relation = relation self.master = master self.identifier = identifier assert (self.relation.has_identity(type(self.master), self.identifier)) self.slaves = slaves self.db = db or connection.connect() self.table = link_table_name( MODES[self.relation.mode], self.relation.model.tablename(), self.relation.identifier, self.relation.related_model.tablename() ) self.db_columns = self.db.table_registry[self.table].columns