2013-01-09 28 views
0

我正在尋找有效的方法用於將CSV數據插入遠程服務器上的SQLite數據庫。我不得不使用PHP。即時通訊使用SQLite3,所以我必須使用PDO(sqlite_query將無法正常工作)。在PHP PDO中插入CSV數據到SQLite - 有沒有比逐行插入更快的方法?

CSV在服務器端,它有100000+行(50MB +文件大小)。

問:有沒有比這更快的PHP方法?

for (/* each row, 100.000 rows */) 
{ 
    $a = 'something'; 
    $b = 'something'; 
    $query = $link->prepare("INSERT INTO user_info (a, b) VALUES (?, ?)"); 
    $query->bindParam(1, $a); 
    $query->bindParam(2, $b); 
    $query->execute(); 
} 

我的SQL文件位於相同的目錄中。

我讀過有關.import命令,但我不知道如何與PDO使用它(我該使用prepare?文件路徑應該怎麼樣子的?)。

我是PDO和SQLite的新手。

+0

閱讀它,然後寫下它。有什麼問題? – KingCrunch

+0

可能重複[批量加載數據到sqlite?](http://stackoverflow.com/questions/697004/bulk-load-data-into-sqlite) – KingCrunch

+0

@KingCrunch它不重複..如果你需要過濾無效值您提供的鏈接只能用於值得信賴的值 – Baba

回答

0

好了,我不知道有一種可以通過PDO驅動程序使用的SQLite批量方法,但是您正在每個循環中重新準備相同的語句。

這可能會是一個觸摸更高效:

$query = $link->prepare("INSERT INTO user_info (a, b) VALUES (?, ?)"); 
for (/* each row, 100.000 rows */) 
{ 
    $a = 'something'; 
    $b = 'something'; 

    $query->bindParam(1, $a); 
    $query->bindParam(2, $b); 
    $query->execute(); 
} 
+0

對。那麼數組呢?我有這樣的數組:$ data [$ row] [$ cell]。我可以以某種方式綁定數組元素嗎?我的意思是動態行索引。我在C#和MSSQL中綁定數組元素時遇到了問題,並且我沒有在這裏使用數組。 – Kamil

+0

我不確定你的意思。 – IMSoP

+0

沒關係。沒有更好的答案,所以...... :) – Kamil

2
$link->beginTransaction(); 

$query = $link->prepare("INSERT INTO user_info (a, b) VALUES (?, ?)"); 
for (/* each row, 100.000 rows */) 
{ 
//variable stuff + execute query 
} 

$link->commit(); 

這個擁有寫操作,直到循環後 - 要快得多。 你需要像這樣創建db對象: $ link = new PDO('sqlite:your.db');

編輯:錯字/粘貼修正

+0

另外,值得注意的是,這可能不會在其他DB系統上產生相同的加速 - 事實上,情況正好相反,因爲DBMS將不得不保持更高的隔離度級別,並獲取鎖定或保持臨時版本的數據。 – IMSoP