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

Reply via email to