SQLだけでこういう処理をする方法が調べてもわからないので、スクリプト側でチェックしてみる。
メイン
------------------------------------------------------------------------------------------
#!/usr/bin/perl -w
use strict;
use DBI;
require './db.pl';
&db::open();
my $table = 'table_name';
##追加カラム情報セット
my @add = (
['field1' ,'INT' ],
['field2' ,'VARCHAR(255)' ],
['field3' ,'DATE' ],
['field4' ,'INT', ],
['field5' ,'VARCHAR(255)' ],
['field6' ,'VARCHAR(255)' ],
['field7' ,'INT' ]
);
my $cols = '';
##現在のテーブル情報を取得
&db::query("DESCRIBE $table");
while(my $href = $db::sth->fetchrow_hashref()){
##カラム名をセット
$cols .= '<>'.$href->{'Field'}.'<>';
}
##無ければ追加
foreach(@add){
if($cols !~ /<>$_[0]<>/){
&db::query("ALTER TABLE $table ADD $_[0] $_[1]");
}
}
&db::close();
exit;
---------------------------------------------------------------------------------------
DB接続(db.pl)
---------------------------------------------------------------------------------------
package db;
use strict;
sub open{
my $dbs = "DBI:mysql:dbname:dbhost";
our $dbh = DBI->connect($dbs,dbuser,dbpass);
if(!$dbh){
die "データベースに接続できません";
}
}
sub query{
my ($sql) = @_;
our $sth = $db::dbh->prepare($sql) || die $db::dbh->errstr();
my $exec = $sth->execute || die $sth->errstr();
return $exec;
}
sub close{
$db::sth->finish;
$db::dbh->disconnect;
}
1;
---------------------------------------------------------------------------------------
メイン
------------------------------------------------------------------------------------------
#!/usr/bin/perl -w
use strict;
use DBI;
require './db.pl';
&db::open();
my $table = 'table_name';
##追加カラム情報セット
my @add = (
['field1' ,'INT' ],
['field2' ,'VARCHAR(255)' ],
['field3' ,'DATE' ],
['field4' ,'INT', ],
['field5' ,'VARCHAR(255)' ],
['field6' ,'VARCHAR(255)' ],
['field7' ,'INT' ]
);
my $cols = '';
##現在のテーブル情報を取得
&db::query("DESCRIBE $table");
while(my $href = $db::sth->fetchrow_hashref()){
##カラム名をセット
$cols .= '<>'.$href->{'Field'}.'<>';
}
##無ければ追加
foreach(@add){
if($cols !~ /<>$_[0]<>/){
&db::query("ALTER TABLE $table ADD $_[0] $_[1]");
}
}
&db::close();
exit;
---------------------------------------------------------------------------------------
DB接続(db.pl)
---------------------------------------------------------------------------------------
package db;
use strict;
sub open{
my $dbs = "DBI:mysql:dbname:dbhost";
our $dbh = DBI->connect($dbs,dbuser,dbpass);
if(!$dbh){
die "データベースに接続できません";
}
}
sub query{
my ($sql) = @_;
our $sth = $db::dbh->prepare($sql) || die $db::dbh->errstr();
my $exec = $sth->execute || die $sth->errstr();
return $exec;
}
sub close{
$db::sth->finish;
$db::dbh->disconnect;
}
1;
---------------------------------------------------------------------------------------

コメントする