[Dbix-class] is_foreign_key_constraint => false is ineffective
Ash Berlin
ash_cpan at firemirror.com
Fri Nov 2 09:31:57 GMT 2007
Jon Schutz wrote:
> I've added is_foreign_key_constraint => 0 as an attribute in a
> relationship, in order to query across the join without imposing
> database level constraints - but the constraint is still appearing in
> the resulting schema.
>
> The doco in Relationship::Base says "set this attribute to a true or
> false value to override the detection of when to create constraints."
>
> Can anyone (particular Jess & Matt whose
Except I wrote that bit of code ;)
names can be found in the
> source) explain the logic in the following bit of code to me? From
> SQL::Translator::Parser::DBIx::Class.pm :
>
> # Make sure we dont create the same foreign key constraint twice
> # Decide if this is a foreign key based on whether the self
> # items are our primary columns.
> # If the sets are different, then we assume it's a foreign key from
> # us to another table.
> # OR: If is_foreign_key_constraint attr is explicity set (or set to false) on the relation
> if ( ! exists $created_FK_rels{$rel_table}->{$key_test} &&
> ( exists $rel_info->{attrs}{is_foreign_key_constraint} &&
> $rel_info->{attrs}{is_foreign_key_constraint} ||
> !$source->compare_relationship_keys(\@keys, \@primary)
> )
> )
> {
> $created_FK_rels{$rel_table}->{$key_test} = 1;
> $table->add_constraint(
> ...
> );
> }
>
> I read it as - if the foreign key has already been created, don't try to
> recreate the same one. If is_foreign_key_constraint has been specified
> and is set, or if the keys are not primary keys, then create the foreign
> key relation. So it seems we can force foreign keys with
> is_foreign_key_constraint = true, but can't forcibly disable them as the
> compare_relationship_keys test wins in the end.
>
> Shouldn't that logic be : if is_foreign_key_constraint has been
> specified then do whatever it says, otherwise test using
> compare_relationship_keys ? i.e.
>
> if ( ! exists $created_FK_rels{$rel_table}->{$key_test} &&
> ( exists $rel_info->{attrs}{is_foreign_key_constraint} ?
> $rel_info->{attrs}{is_foreign_key_constraint} :
> $source->compare_relationship_keys(\@keys, \@primary)
> )
> ) ...
>
> ?
>
Yes good point. Of course I only ever wanted it to force creating of
keys, not stop it. Fancy putting together some test cases for this? (By
creating a patch against t/86sqlt.t and other files?
-ash
More information about the DBIx-Class
mailing list