【问题标题】:Inserting CSV data to SQLite in PHP PDO - is there any faster method than insert row by row?在 PHP PDO 中将 CSV 数据插入 SQLite - 有没有比逐行插入更快的方法?
【发布时间】:2012-12-23 13:58:13
【问题描述】:

我正在寻找将 CSV 数据插入远程服务器上的 SQLite 数据库的有效方法

我必须使用 PHP。我使用的是 SQLite3,所以我必须使用 PDO(sqlite_query 不起作用)。

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 的新手。

【问题讨论】:

  • 读,然后写。有什么问题?
  • Bulk load data into sqlite? 的可能重复项
  • @KingCrunch 它不重复.. 如果您需要过滤无效值怎么办?您提供的链接仅适用于可信值
  • @Baba 那会有所不同,但问题不包含“过滤器”,它仅包含“将 CSV 插入 SQLite 数据库”。提到的OP也提到了.import自己。如果你是对的,OP应该澄清他的问题,否则它是重复的:)

标签: php sqlite insert pdo bulk


【解决方案1】:
$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');

编辑:错字/粘贴更正

【讨论】:

  • 另外,值得注意的是,这可能不会在其他数据库系统上产生相同的加速 - 事实上,恰恰相反,因为 DBMS 必须保持更高的隔离级别,并且要么获取锁定或维护数据的临时版本。
【解决方案2】:

好吧,我不知道是否有可以通过 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();
}

【讨论】:

  • 对。那么数组呢?我有这样的数组:$data[$row][$cell]。我可以以某种方式绑定数组元素吗?我的意思是动态行索引。我在 C# 和 MSSQL 中绑定数组元素时遇到了问题,我在这里没有使用数组。
  • 我不确定你的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2012-06-27
  • 2019-09-21
  • 1970-01-01
相关资源
最近更新 更多