Esempio n. 1
0
	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?
Esempio n. 2
0
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	)
Esempio n. 3
0
	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
			)
Esempio n. 4
0
	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()
		)
Esempio n. 5
0
	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