2010-01-18 90 views
2

爲什麼不行「$ rc = $ dbh-> func('dropdb',$ dbname,'admin');」刪除數據庫db_test_2?DBD :: mysql - 刪除數據庫的問題

#!/usr/bin/perl 
use warnings; 
use strict; 
use 5.010; 
use DBI; 

my $host = 'localhost'; 
my $user = 'user'; 
my $password = 'password'; 
my($rc, $dbname, @databases); 



my $drh = DBI->install_driver('mysql'); 
$dbname = 'db_test_1'; 

# use a driver handle (drh) 

$rc = $drh->func('createdb', $dbname, $host, $user, $password, 'admin'); 
say for DBI->data_sources($driver, { host => $host, user => $user, password => $password }); 
# DBI:mysql:information_schema 
# DBI:mysql:db_test_1 
# DBI:mysql:mysql 


$rc = $drh->func('dropdb', $dbname, $host, $user, $password, 'admin'); 
say for DBI->data_sources($driver, { host => $host, user => $user, password => $password }); 
# DBI:mysql:information_schema 
# DBI:mysql:mysql 



my $dbh = DBI->connect("DBI:mysql:", $user, $password, { RaiseError=>1, AutoCommit=>1 }); 
$dbname = 'db_test_2'; 

# reuse the existing connection of a database handle (dbh) 

$rc = $dbh->func('createdb', $dbname, 'admin'); 
say for DBI->data_sources($driver, { host => $host, user => $user, password => $password }); 
# DBI:mysql:information_schema 
# DBI:mysql:db_test_2 
# DBI:mysql:mysql 

$rc = $dbh->func('dropdb', $dbname, 'admin'); 
say for DBI->data_sources($driver, { host => $host, user => $user, password => $password }); 
# DBI:mysql:information_schema 
# DBI:mysql:db_test_2 
# DBI:mysql:mysql 

回答

3

有趣的是,在DBI func()採取了不同的定義,但DBD :: MySQL有一個說服的方法給它什麼是真正的_admin_internal方法,這是在Mysql.xs定義,看起來有相當多的電話do_error(),這使我相信你應該檢查錯誤。嘗試連接RaiseError => 1,看看它說什麼。

要做到這一點,連與

$dbh = DBI->connect("DBI:mysql:database=$db;host=$host", 
         $user, $password, {RaiseError => 1}); 

然後用$dbh->func('dropdb' ...),看看會發生什麼。

+0

我不知道,如果這是檢查錯誤的正確方法,但是當我編寫「 $ dbh-> func('dropdb',$ dbname,'admin'); 說$ dbh-> { 'mysql_error'};」 我得到「MySQL服務器已經消失」;但我不知道他爲什麼離開了。 – 2010-01-18 19:39:00

+0

如果你這樣做了,我會在服務器以超級瘋狂的冗長模式運行時檢查mysql日誌(不過你這樣做),我會做下一件事。 – 2010-01-18 20:13:06

+0

我不知道我是否以正確的方式理解了你,但是在我的DBI腳本中RaiseError始終處於打開狀態。我發現的事情是,它不僅是讓服務器消失的「dropdb」,實際上在這個例子中它是「createdb」。但也許這是一個功能。 由於還有其他方法來創建和刪除數據庫,除了不滿意的好奇心之外,這對我來說應該不是什麼大問題。 – 2010-01-20 08:28:26