On Tue, Nov 18, 2008 at 6:17 PM, John Goulah <[EMAIL PROTECTED]> wrote: > On Tue, Nov 18, 2008 at 10:03 AM, luke saunders <[EMAIL PROTECTED]> wrote: >> On Mon, Nov 17, 2008 at 11:23 PM, John Goulah <[EMAIL PROTECTED]> wrote: >>> So far I've been using sqlt-diff to diff two files: >>> file1.sql=MySQL file2.sql=MySQL >>> >>> >>> but what I really need is to be able to diff a file against the actual >>> database and produce a diff. >>> >>> >>> I see there is a parser called DBI-MySQL, but I'm not sure how to >>> invoke it. My thought would be to use a DSN string, but then how >>> would one supply a username/password? >>> >>> >>> If someone can clear this up I would be glad to patch the help output >>> to give some better examples on how this may work. >>> >> >> Hi John, >> >> I have done some work which involved creating a diff directly against >> the database. >> >> Essentially I create one SQLT object like so: >> >> my $db_tr = SQL::Translator->new({ >> add_drop_table => 1, >> parser => 'DBI', >> parser_args => { dbh => $dbh } >> }); >> > > > > Thanks Luke, > > I'm essentially going with that approach but I'm having a bit of > weirdness. I create a DBI parser like that and also a file based > parser. When I run them through schema_diff I get basically a create > for every table as my output, which seems to me that one of the > parsers is empty. I've tracked that down to my DBI parser. > > > I created the dbh something like: > my $dbh = DBI->connect($dsn, 'user', 'pass', {'RaiseError' => 1}); > > and I know that works fine because I was able to select some rows. > > Then I created the object like you said: > > > my $db_tr = SQL::Translator->new({ > add_drop_table => 1, > parser => 'DBI', > parser_args => { > dbh => $dbh > } > }); > $db_tr->producer('MySQL'); # do I need this? > > > I can dump out the object, and the schema object, but it just barfs on > the get_tables call > > warn Dumper($db_tr); > warn Dumper($db_tr->schema); > warn Dumper($db_tr->schema->get_tables); > > and the output: > > $VAR1 = bless( { > 'parser_args' => { > 'dbh' => bless( {}, 'DBI::db' ) > }, > 'quote_field_names' => 1, > '_ID' => 'SQL::Translator', > 'parser' => sub { "DUMMY" }, > 'quote_table_names' => 1, > 'parser_type' => 'SQL::Translator::Parser::DBI', > 'add_drop_table' => 1, > '_DEBUG' => 1, > 'producer' => sub { "DUMMY" }, > 'debug' => 1, > '_ERROR' => '', > 'producer_type' => 'SQL::Translator::Producer::MySQL' > }, 'SQL::Translator' ); > > $VAR1 = bless( { > 'translator' => bless( { > 'parser_args' => { > 'dbh' => > bless( {}, 'DBI::db' ) > }, > 'quote_field_names' => 1, > '_ID' => 'SQL::Translator', > 'parser' => sub { "DUMMY" }, > 'schema' => $VAR1, > 'quote_table_names' => 1, > 'parser_type' => > 'SQL::Translator::Parser::DBI', > 'add_drop_table' => 1, > '_DEBUG' => 1, > 'producer' => sub { "DUMMY" }, > 'debug' => 1, > '_ERROR' => '', > 'producer_type' => > 'SQL::Translator::Producer::MySQL' > }, 'SQL::Translator' ), > '_ID' => 'SQL::Translator::Schema', > '_DEBUG' => 0, > '_ERROR' => '' > }, 'SQL::Translator::Schema' ); > > Warning: something's wrong at db_diff.pl line 38. ### > $db_tr->schema->get_tables > > > > > Also, I tried adding that other bit of code you had, the only other > thing I could think of that I was missing. This bit: > > foreach my $tr ($db_tr, $file_tr) { > my $data = $tr->data; > $tr->parser->($tr, $$data); > } > > > And very strangely that gives me: > Undefined subroutine &SQL::Translator::Parser::DBI::MySQL::parse > called at > /home/jgoulah/wdir/sqlfairy_trunk/sqlfairy/lib//SQL/Translator/Parser/DBI.pm > line 179 > > > I'm a bit stuck, if anyone has a clue. > > Thanks for all the ideas so far! > John >
After much debugging I have figured this out. Seems after my $db_tr creation I also needed to set this for it to load up correctly: $db_tr->parser('SQL::Translator::Parser::DBI::MySQL'); Also, I still needed "parser => DBI" in the instantiation args. And I didn't need the foreach bit but I did need this to load up the data: $db_tr->parse($db_tr, $dbh); Thanks, John ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ -- sqlfairy-developers mailing list sqlfairy-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sqlfairy-developers