[prev] [thread] [next] [Date index for 2004/06/29]
Hi,
since in Postgres you can define references in the tables like
CREATE TABLE my_table
( id serial PRIMARY KEY,
ref integer REFERENCES other_table
);
I wrote a littel sub that looks up those references in the databse and
set the has_a / has_many references. Maybe it would be worth including
in CDBI::Pg?
here it is:
# Create has_a realtion defined for $table in $namespace as
# $namespace::$table->has_a( $column => $namespace::$foreign );
#
# and has_many relation as
# $namespace::$foreign->has_many( "$table_referencing_$column" =>
# $namespace::$table );
sub set_up_references{
my $self = shift;
my $table = shift;
my $namespace = shift;
my $package = $namespace ."::".
Class::DBI::AutoLoader::table2class($table);
my $dbh = $package->db_Main;
my $catalog = "";
$catalog = 'pg_catalog.' if ($package->pg_version >= 7.3);
#find oid of table
my $sth = $dbh->
prepare("SELECT oid FROM ${catalog}pg_class WHERE relname = ?");
$sth->execute($table);
my ($oid) = $sth->fetchrow_array;
$sth->finish;
#find all foreign_key constraints
$sth = $dbh->prepare(<<"SQL");
SELECT conkey, confrelid
FROM ${catalog}pg_constraint
WHERE conrelid = ${oid} AND contype = 'f'
SQL
$sth->execute();
my $reflist = $sth->fetchall_arrayref;
$sth->finish;
$sth = $dbh->prepare(<<"SQL");
SELECT a.attname, c.relname
FROM ${catalog}pg_attribute a, ${catalog}pg_class c
WHERE a.attnum = ? AND a.attrelid = ${oid} AND c.oid = ?
SQL
foreach my $ref (@$reflist) {
$$ref[0] =~ /(\d+)/;
$$ref[0] = $1;
$sth->execute( @$ref );
my ( $c, $r ) = $sth->fetchrow_array;
my $foreign = $namespace ."::". Class::DBI::AutoLoader::table2class($r);
my $desc = $table.'_referencing_'.$c;
eval { $package->has_a ( $c => $foreign ); };
eval { $foreign->has_many ( $desc => $package, $c ); };
}
}
#--------
Grüße,
Andreas Fromm
|
sub to automatically set up relations for postgres
|
Generated at 11:34 on 01 Dec 2004 by mariachi v0.52