Let say you're like me and need to get ~2Gib of records into a SQL database. Most of us are probably running a shared hosted server and have limitations regarding file upload size in phpMyAdmin. Honestly, after discovering this new method, I dont know that I'll ever upload big data another way.
Here is a great PHP Script from Stavros Skamagkis that uses PDO. It is pretty self explanatory. I've included a modified version below.
So how long does the import take? Well, in my case I have ~1,800,000 records with 30 columns and it takes seconds, like less than 5 π.
Tips:
Define
fieldseparator
,fieldEscapedBy
,fieldEnclosedBy
, andlineSeperator
as variables (shown in first few lines). I span my wheels a little defining them inline which did not work (I believe because of PDO).CSV file location is relative to this files location.
Header? Use
IGNORE 1 LINES
to skip the first line.How to run? I created a Development Button and linked
onClick()
that connects via Ajax to the resource. I'm know there are easier methods, I just already had it setup. Nevertheless, this works.
<?php // Code Source: https://gist.github.com/stavrossk/0f513ccbfe7882870ab1 $databasehost = "localhost"; $databasename = "YOUR_DATABASE_NAME"; $databasetable = "YOUR_DATABASE_TABLE"; $databaseusername = "YOUR_DATABASE_USERNAME"; $databasepassword = 'YOUR_DATABASE_PASSWORD'; $fieldSeparator = ";"; $fieldEscapedBy = ""; $fieldEnclosedBy = '"'; $lineSeparator = "\n"; $csvfile = "../FILE_TO_IMPORT.csv"; if (!file_exists($csvfile)) { error_log('File does NOT exist!'); die("File not found. Make sure you specified the correct path."); } try { $pdo = new PDO( "mysql:host=$databasehost;dbname=$databasename", $databaseusername, $databasepassword, array( PDO::MYSQL_ATTR_LOCAL_INFILE => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); } catch (PDOException $e) { error_log('database connection failed!'); die("database connection failed: " . $e->getMessage()); } $affectedRows = $pdo->exec( "LOAD DATA LOCAL INFILE " . $pdo->quote($csvfile) . " INTO TABLE `$databasetable` FIELDS TERMINATED BY " . $pdo->quote($fieldSeparator) . " ESCAPED BY " . $pdo->quote($fieldEscapedBy) . " ENCLOSED BY " . $pdo->quote($fieldEnclosedBy) . " LINES TERMINATED BY " . $pdo->quote($lineSeparator) . " IGNORE 1 LINES " ); echo "Loaded a total of $affectedRows records from this csv file.\n"; ?>
Top comments (0)