首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将csv文件中的数据插入mySQL数据库(大数据,快速方式)?

如何将csv文件中的数据插入mySQL数据库(大数据,快速方式)?
EN

Stack Overflow用户
提问于 2015-11-19 18:24:07
回答 2查看 689关注 0票数 1

我希望将已经在我的服务器上的csv文件中的数据插入我的数据库。

代码语言:javascript
复制
$myfile = "./files/data.csv";

这是我的联系:

代码语言:javascript
复制
class Database 
{
    private static $dbName = 'dbname' ; 
    private static $dbHost = 'localhost' ;
    private static $dbUsername = 'dbuser';
    private static $dbUserPassword = 'dbpassword';

    private static $cont  = null;

    public function __construct() {
        exit('Init function is not allowed');
    }

    public static function

 connect()
    {

   if ( null == self::$cont )
   {      
    try 
    {
      self::$cont =  new PDO( "mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword);  
      self::$cont->query("SET NAMES utf8");
      self::$cont->query("SET CHARACTER SET utf8");
    }
    catch(PDOException $e) 
    {
      die($e->getMessage());  
    }
   } 
   return self::$cont;
}

public static function disconnect()
{
    self::$cont = null;
}

}

我就是这样把数据插入到数据库中的:

代码语言:javascript
复制
error_reporting(E_ALL); ini_set('display_errors', 1);

try {
   $pdo = Database::connect();
   $sql = "LOAD DATA INFILE '$myfile'
   INTO TABLE `animals`
   FIELDS TERMINATED BY ','
   OPTIONALLY ENCLOSED BY '\"'
   LINES TERMINATED BY '\n'
   (id,name,animal)";
   $q = $pdo->query($sql);
   $q->execute();
} catch (PDOException $q) {
  echo 'Connection failed: ' . $q->getMessage();
}

我的csv文件如下所示:

代码语言:javascript
复制
12,fred,cat,
13,tom,dog,

这是我数据库里的动物表

代码语言:javascript
复制
╔════╦═════════╦════════╦════════╗
║ id ║  name   ║  age   ║ animal ║ 
╠════╬═════════╬════════╬════════╣
║    ║         ║        ║        ║
║    ║         ║        ║        ║
║    ║         ║        ║        ║
║    ║         ║        ║        ║
╚════╩═════════╩════════╩════════╝

不幸的是,它不能工作,这意味着没有数据被插入到我的数据库中。我希望你能提供帮助:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-23 11:48:01

终于成功了。原因实际上是没有服务器权限问题。这是数据库连接中的一个问题。

以下是工作代码:

代码语言:javascript
复制
$pdo = Database::connect();

$sql = "LOAD DATA LOCAL INFILE 'http://www.mypage.myfile.csv'
        INTO TABLE test
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY '\n' 
        IGNORE 1 LINES
        (id,name,animal)";

$con=mysqli_connect("localhost","dbuser","dbpassword","dbname");

if (mysqli_connect_errno()) {
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
};

$result = mysqli_query($con, $sql);

if (mysqli_affected_rows($con) == 1) {
   $message = "The data was successfully added!";
} else {
   $message = "The user update failed: ";
   $message .= mysqli_error($con); 
};

echo $message;
mysqli_close($con);
票数 0
EN

Stack Overflow用户

发布于 2015-11-19 18:42:56

MySQL服务器端有一些因素会影响使用LOAD DATA INFILE的行为。

MySQL Config

MySQL对本地和服务器文件系统访问都有自己的限制。这样的系统设置之一是--secure_file_priv,您可以使用它进行阅读手册中的更多内容。

--secure_file_priv 此变量用于限制数据导入和导出操作的效果,例如由LOAD DATASELECT ... INTO OUTFILE语句以及LOAD_FILE()函数执行的操作。默认情况下,此变量为空。如果设置为目录的名称,则将导入和导出操作限制为仅处理该目录中的文件。

因此,如果此设置是非空的,则需要将文件移动到配置的目录中,以便MySQL能够读取它,或者您需要相应地更改它。

还确保在代码中提供绝对文件路径,因为相对路径对服务器没有意义。

MySQL用户特权

有关用户权限如何使用MySQL和SELECT .. INTO OUTFILE (即连接到MySQL的用户需要拥有FILE特权才能使用这些语句)的详细信息,请参阅6.2.1 MySQL提供的特权手册节。在这种情况下,这将是您的self::$dbUsername

文件系统权限

最后,MySQL用户需要有足够的文件系统权限从给定的文件中读取,否则它将无法完成操作。通过使用chmod()打开world read权限,您可以确保这不是一个问题。通常情况下,您的umask应该已经涵盖了这一点,但是最好先验证,而不是假设它已经完成了。

更好的错误处理

此外,由于您在这里使用的是try/catch,可能需要注意的是,您可能希望将PDO置于异常模式,因为如果您的MySQL服务器返回错误,它将不会抛出异常,例如在本例中。

您可以在对PDO的构造函数调用中这样做。

代码语言:javascript
复制
new PDO($dsn, $user, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

有关详细信息,请参阅错误和错误处理手册。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33811565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档