在perl中使用LOAD DATA INFILE在MYSQL中插入值

时间:2011-08-03 17:35:34

标签: mysql perl

我正在尝试使用perl将CSV文件上传到mysql数据库。我的perl脚本将驻留在服务器上,我将通过浏览器访问该服务器。在浏览器中,将有一个上传文件的选项。

问题是,我将如何做到这一点

  1. 我是否需要将该文件保存在服务器上的某个位置然后使用它?
  2. 我可以通过提供固定路径直接使用笔记本电脑中的文件吗?
  3. 到目前为止,我尝试过这样做

    if($update eq "fullLoad"){
    $filename =  param("customPricing");
    
    
    my $upload_filehandle = upload("customPricing"); 
    open ( UPLOADFILE, ">$filename" ) or die "$!"; 
    
    binmode UPLOADFILE; 
    while ( <$upload_filehandle> )
    {
        print UPLOADFILE; 
    } 
    close UPLOADFILE; 
    
    
    $query = "LOAD DATA INFILE '\bigmac\bm_src\html\cgi-bin\testbrocade\$filename' INTO TABLE customPricingTest FIELDS TERMINATED BY ','";
    $sth = $dbh->do($query) or die "SQL Error: $DBI::errstr\n"; 
    
    print $sth . "Records Uploaded <br/>";
    

    }

    已编辑 - &gt;上面的代码为用户抛出错误Access Denied。我成功地能够在服务器上创建文件,但看起来我正在访问它时出错。有什么想法吗?

    谢谢, Nitesh

1 个答案:

答案 0 :(得分:1)

回答问题1:如果你正在使用LOAD DATA INFILE,是的,服务器系统和数据库用户需要访问该文件。如果使用LOAD DATA LOCAL INFILE,则该文件可以保留在单独的系统上,由Perl脚本运行,并且数据将在网络连接中上载。两者之间存在权限和设置差异,但无论哪种方式都表现非常好,我们没有看到在本地或远程加载数据方面存在巨大差异。

对于第二个问题,这是LOAD DATA LOCAL INFILE的用途。这里,因为文件是通过DBI连接读取和传递的,所以文件路径需要相对于脚本运行的位置。它不需要像LOAD DATA INFILE那样绝对。它甚至不需要是固定的路径。我们已成功使用临时文件,只要在您与数据库断开连接之后才删除文件。