Skip to content

Instantly share code, notes, and snippets.

@jjl
Created April 17, 2013 15:21
Show Gist options
  • Save jjl/5405191 to your computer and use it in GitHub Desktop.
Save jjl/5405191 to your computer and use it in GitHub Desktop.
Conversion from MySQL to other SQLs using SQL::Translate
#!/usr/bin/perl
use strict;
use warnings;
use SQL::Translator;
use File::Basename qw( basename dirname );
use Cwd qw( realpath );
use File::Temp qw( tempfile tempdir );
my $dir = realpath( dirname(__FILE__) . '/../' );
my %out = (
SQLite => {
dir => 'SQLite',
suffix => '.sql',
},
PostgreSQL => {
dir => 'PostgreSQL',
suffix => '.sql',
},
MySQL => {
dir => 'MySQL',
suffix => '.sql',
},
YAML => {
dir => 'YAML',
suffix => '.yaml',
},
);
my %groups = (
'schema' => [
'2009-04-11-1404-create.sql', '2009-04-12-2330-foreign-keys.sql',
'2009-04-13-1637-api-keys.sql',
],
);
our %tempfiles;
sub pre_filter {
my $file = shift;
if ( exists $tempfiles{$file} ) {
return $tempfiles{$file}->{fn};
}
my $rfile = $dir . '/sql/' . $file;
print "Processing $rfile ...\n";
$tempfiles{$file} = {
fh => File::Temp->new(
TEMPLATE => 'SQLConvert_' . basename($file) . '_XXXX',
DIR => '/tmp/',
SUFFIX => '.tmp'
),
};
$tempfiles{$file}->{fn} = $tempfiles{$file}->{fh}->filename;
$tempfiles{$file}->{fh}->unlink_on_destroy(1);
open my $out, '>', $tempfiles{$file}->{fn} or die "$^E";
open my $in, '<', $rfile or die "$^E";
while ( my $line = <$in> ) {
chomp($line);
$line =~ s/--.*$//;
next if $line =~ /^\s*$/;
print $out $line, "\n";
}
close $in;
close $out;
return $tempfiles{$file}->{fn};
}
for my $outfile ( keys %groups ) {
for my $outdir ( sort keys %out ) {
my $pdir = $dir . '/sql/aggregate/' . $out{$outdir}->{dir};
mkdir $pdir;
my $target = $pdir . '/' . $outfile . $out{$outdir}->{suffix};
print "Generating $target for language $outdir \n";
my $t = SQL::Translator->new( show_warnings => 1, );
(
my $out = $t->translate(
from => 'MySQL',
to => $outdir,
filename => [ map { pre_filter($_) } @{ $groups{$outfile} } ],
)
) or die $t->error;
open my $wh, '>', $target or die "$^E";
print $wh $out;
close $wh;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment