in reply to Abstracting Class::DBI Database Connection Data

Read the section of the Class::DBI doc titled "Dynamic Database Connections / db_Main".

----
send money to your kernel via the boot loader.. This and more wisdom available from Markov Hardburn.

  • Comment on Re: Abstracting Class::DBI Database Connection Data

Replies are listed 'Best First'.
Re^2: Abstracting Class::DBI Database Connection Data
by gryphon (Abbot) on Jun 08, 2004 at 22:15 UTC

    Greetings hardburn,

    I have. Many times. But apparently I'm not smart enough to figure it out. This works:

    package MyCDBI; use base 'Class::DBI::mysql'; __PACKAGE__->connection('dbi:mysql:mydb', 'me', 'mypwd');

    But this doesn't:

    package MyCDBI; use base 'Class::DBI::mysql'; sub db_Main { use DBI; return DBI->connect('dbi:mysql:mydb', 'me', 'mypwd') or die DBI->errstr; }

    I get the nice error message: Can't locate object "fetch_hash" via package "DBI::st" at Class/DBI/mysql.pm line 65. The calling script only uses MyCDBI and prints a hello world, so there's nothing from that that's causing this. Any suggestions?

    gryphon
    code('Perl') || die;

      Doesn't db_Main have to return an Ima::DBI compatible handle now, rather then just a plain DBI handle?

      It says so, rather obliquely:

      The preferred method for doing this is to supply your own db_Main() method rather than calling connection(). This method should return a valid database handle, and should ensure it sets the standard attributes described above, preferably by combining $class->_default_attributes() with your own.

      I think the part about a valid database handle is where they mean one derived from Ima::DBI.

      Update:

      If you scan up right above the Dynamic Database Connections / db_Main heading, it says:

      We use the inherited RootClass of DBIx::ContextualFetch from Ima::DBI, and you should be very careful not to change this unless you know what you're doing!

      Maybe someone with a little more knowledge on this than I can provide a working example?

        Maybe someone with a little more knowledge on this than I can provide a working example?

        Yes, exactly. I think I get what I need to do, but I most certainly don't have a clue how to do it. If anyone has some working code they'd be willing to share, I would be very grateful.

        gryphon
        code('Perl') || die;