2010-01-18 88 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