Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > как сделать копию таблицы?


Автор: s_a_s_h_a 21.9.2004, 11:46
Здравствуйте. Скажите, пожалуйста. Как из перла создать в БД2 таблицу test2 являющейся копией таблицы test1 из БД1?

Автор: GoodBoy 21.9.2004, 11:55
Вот это поможет тебе прочитать структуры таблиц, а дальше, думаю справишься... :-))))))

Код
#!/usr/bin/perl -w

use DBI;
use config;

print "Content-type: text/html\n\n";

$dbh = DBI->connect("DBI:mysql:database=$db->{base};host=localhost",
                       $db->{login}, $db->{pass}) || die "die connect";
@tables = $dbh->tables;
@tables = sort {$a cmp $b} (@tables);
%types = (
   '-6' => 'tinyint',
   '-1' => 'blob',
   '1'     => 'char',
   '4'     => 'int',
   '5'  => 'smallint',
   '3'     => 'number',
   '8'     => 'number',
   '9'     => 'date',
   '10' => 'time',
   '11' => 'timestamp',
   '12' => 'varchar'
);

foreach my $pr (@tables) {
   print "<br><b><a onclick=\"document.all['_$pr'].style.display=(''+document.all['_$pr'].style.display=='none')?'block':'none'\" style='cursor:hand'>",$pr,"</a></b>";
   $sth = $dbh->prepare("SELECT * FROM $pr") or print "&nbsp;&nbsp;&nbsp;&nbsp;".$dbh->errstr;
   $rvs = $sth->execute or die "execute: ".$sth->errstr."\n";
   print "<br>";
   $nf = $sth->{'NUM_OF_FIELDS'};
   print "<div id=_$pr style='display:block'><table border=1 cellpadding=2 cellspacing=0><tr><td>Имя поля</td><td>Tип поля</td><td>Размер</td><td>Зн. после зп.</td></tr>";
   for (my $i=0; $i<$nf; $i++) {
       print "<tr>";
       print "<td><b>",${$sth->{'NAME'}}[$i],"</b></td>";
       print "<td>",$types{${$sth->{'TYPE'}}[$i]},"</td>";
       print "<td>",${$sth->{'PRECISION'}}[$i],"</td>";
       print "<td>",((${$sth->{'SCALE'}}[$i])?${$sth->{'SCALE'}}[$i]:'&nbsp;'),"</td>";
       print "</tr>";
   }
   print "</table></div>";
}


Работает в ИЕ.

Автор: s_a_s_h_a 21.9.2004, 12:20
Я вообще-то хотел немного другое узнать. Наверное, я плохо объяснил. Точно совсем не то написал.
Еще попытка...
Есть БД - BD1, в ней таблица TABLE1, есть БД - BD2, в ней таблица TABLE2, структура которой анологична
структуре TABLE1, теперь мне надо скопировать данные из TABLE1 into TABLE2. Вопрос: можно ли сделать
не так как здесь:

Код
my $dbh = DBI->connect("DBI:mysql:BD1",'user','password');
my @M1=();
my @M2=();

my $sth = $dbh->prepare("select * from TABLE1 where ....");
$sth->execute();
while( my ($p1,$p2,...)=$sth->fetchrow_array)
{ push(@M1,$p1);
  push(@M2,$p2);
  ............
}
$dbh->disconnect;

my $dbh = DBI->connect("DBI:mysql:BD2",'user','password');

for(my $i=0;$i<scalar(@M1);$i++)
{ $sth = $dbh->prepare(q{{insert into TABLE2 (...) values (?,?....)});
  $sth->execute($M1[$i],$M[$2],...);
  $sth->finish;
}


Можно ли это оптимизировать?

Автор: GoodBoy 21.9.2004, 12:50
Могу немного ошибиться с синтаксисом...

Код
my $dbh1 = DBI->connect("DBI:mysql:BD1",'user','password');
my $dbh2 = DBI->connect("DBI:mysql:BD2",'user','password');
my $sth1 = $dbh1->prepare("select * from TABLE1 where ....");
my $sth2 = $dbh2->prepare("insert into TABLE2 values (?,?....)");
$sth1->execute();
while (my @arr = $sth1->fetchrow_array) {
       $sth2->execute(join(",", @arr));
}
$sth1->finish;
$sth2->finish;
$dbh1->disconnect;
$dbh2->disconnect;


Но это при условии, что таблицы имеют АБСОЛЮТНО идентичную структуру!!!!! Вплоть до порядка следования полей!!!!!!

Автор: ElectricalStorm 21.9.2004, 13:04
можно одним запросом ...

insert into TABLE2 values (select from TABLE1)

Автор: GoodBoy 21.9.2004, 13:08
ElectricalStorm
Нельзя!!! Почитай внимательно вопрос!!! Там РАЗНЫЕ базы!

Автор: ElectricalStorm 21.9.2004, 17:00
точно thumbs-up.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)