revtopo has asked for the wisdom of the Perl Monks concerning the following question:

I have been trying to create relation between the tables in Maypole. the tables that i use is actually downloaded from uniprot. all the tables have a primary key(whhich is essential for MAypole) and the tables i wish to relate have commom keys.
TOPO->config{loader}->relationship($_) for ("ventry has ventryabstract +"); 1;
the error am getting is : failed to resolve handler `TOPO': Can't call method "has_many" on an undefined value at /home/jic-atidb/lib/site_perl/5.8.0//Class/DBI/Loader/Relationship.pm line 96.\nCompilation failed in require at (eval 4) line 3.\n I could not get what these error is and how to get out of that. could any one help me out of this please. thanks.

Replies are listed 'Best First'.
Re: how to create relation between the tables.
by Corion (Patriarch) on Jul 16, 2007 at 10:22 UTC

    The only situation where I ever found Class::DBI::Loader::Relationship to work was in Simon Cozen's demonstration. In all other cases I found it to be far more work to find the magic English incantation to make C:DBI:L:R work than it was to simply manually specify the relationship to Class::DBI.

    From the error message you posted, the error seems to happen somewhere in a package "TOPO", or close to it. We will need the Class::DBI setup Perl code, and it will also help us if you show us the database structure of the two tables you're trying to relate.

    I recommend that you whittle down your code to a basic test file that has the same problems but as little code as possible, most likely something such as the following:

    package TOPO; use base 'Class::DBI'; TOPO->connection(...); package TOPO::ventry; ... package TOPO::ventryabstract; ... package main; # define the relationship here
      #!/jic-atidb/perl/bin/perl package TOPO; use warnings; use Carp; use base 'Apache::MVC'; use Class::DBI::Loader::Relationship; use Data::Dumper; use Maypole::Constants; my $title = "TOPO database. Very rudimentary interface as a starting p +oint for development."; TOPO->setup("dbi:mysql:topo_interpro2","nobody","",{AutoCommit => 1, P +rintError => 1}); # creating connectionsto the DBI. TOPO->config->{uri_base} = "http://atidb.org/topo/"; TOPO->config->{rows_per_page} = 20; TOPO->config->{template_root} = "/jic-atidb/w3/topo/"; TOPO->config->{application_name} = $title; #TOPO->config->{display_tables} =[qw[VENTRY VENTRYABSTRACT]]; #TOPO->config->{loader}->relationship($_) for #("ventry has ventryabstract"); #1; sub debug { return 2; } 1;
      this is to create the tables: CREATE TABLE`topo_interpro2`.`VENTRYXREF` AS SELECT E.ENTRY_AC,E.NAME, X.DBCODE,X.AC,X.NAME AS XREFNAME FROM ENTRY E, ENTRY_XREF X WHERE E.ENTRY_AC = X.ENTRY_AC AND E.NAME LIKE '%topoisomerase%';

      CREATE TABLE`topo_interpro2`.`VENTRYDATABASE` AS SELECT E.ENTRY_AC, E.NAME, X.AC,C.DBCODE,C.DBNAME FROM ENTRY E, ENTRY_XREF X, CV_DATABASE C WHERE E.ENTRY_AC = X.ENTRY_AC AND X.DBCODE = C.DBCODE AND E.NAME LIKE '%topoisomerase%';