| Category: | Database Migration |
| Author/Contact Info | /msg jeffa |
| Description: | I am excited about DBD::SQLite (thanks again,
Matts)!! Instead of peeing my pants over it, i wrote a
very simple migration script for use with a MySQL
database. I plan on using this to help with the creation
of demo sites (see Re: Would you use SQLite?).
Comments and suggestions are always welcome. Error handling could be better ... but it works for me. I am more interested in improving the process of filtering out the MySQL specific SQL so SQLite doesn't choke on them, as well as being able to migrate from other database vendors. (And shame on me for shoving the entire output of mysqldump into DBI's do() method as a scalar!) Written for Linux, sorry Windows programmers. UPDATE: (Wed Mar 5 09:04:52 CST 2003)Indeed Podmaster ... go SQL Fairy!!!! :D |
#!/usr/bin/perl -w
use strict;
use DBI;
use Getopt::Std;
use vars qw(%opts);
getopts('u:s:d:h',\%opts);
my ($user,$host,$db,$help) = parse_args(\%opts);
USAGE() and exit unless $user and $host and $db and not $help;
my $table = join(' ',@ARGV);
open(DUMP, "mysqldump -u $user -p -h $host $db $table |");
my $sql = do {local $/; <DUMP>};
$sql =~ s/^#.*$//mg; # chokes on comments
$sql =~ s/auto_increment//g; # on 'auto_increment'
$sql =~ s/TYPE=\w+;/;/g; # and on 'TYPE=____'
$sql =~ s/\\'/''/g; # and on escaped '
my @table = $sql =~ /CREATE\s+TABLE\s+(\w+)/g;
print "creating tables: ",join(' ',@table),"\n";
my $dbh = DBI->connect(
("DBI:SQLite:dbname=$db.dbm"),
{RaiseError=>1}
);
$dbh->do($sql);
sub parse_args {
my %opt = %{+shift};
return @opt{qw(u s d h)};
}
sub USAGE {print "USAGE: $0 -u user -s server(host) -d database\n"}
=pod
=head1 NAME
mysql2sqlite.pl - MySQL database migration script
=head1 DESCRIPTION
This is a simple Perl DBI script for use with the MySQL
and SQLite database drivers. The script opens a pipe to
the mysqldump program to retrieve CREATE and INSERT
statements for the specified tables. This data is then
munged to conform with SQLite, and then fed to a dbm
file named the same as the database.
=head1 SYNOPSIS
./mysql2sqlite.pl -u user -s host -d dbase table1 table2 table3
This will create a dbm named 'dbase.dbm' with three tables
(table1, table2, table3) provided that they all exist in
the MySQL database. If tables are not supplied, then ALL
TABLES in the database will be migrated. If a table already
exists in the dbm file, then the script will stop execution
before that table's data is migrated (simplicity vs.
robustness, i chose simplicity).
=head1 LEGAL STUFF
Mi casa su casa, but if you get hurt or someone gets hurt
from this casa, then it's your casa, not mine.
=cut
|
|
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: MySQL 2 SQLite
by PodMaster (Abbot) on Feb 03, 2003 at 17:03 UTC | |
by Anonymous Monk on Mar 04, 2003 at 21:18 UTC |