【发布时间】:2015-08-06 17:11:02
【问题描述】:
我目前正在尝试将多值 INSERT 查询与 SQLite3 和 PDO 一起使用。
我做了一些研究,发现在 SQLite 版本之前:3.7.11 不支持多值 INSERT 语法。自(2012 年)以来,这种情况发生了变化。
我的 phpinfo() 通知我:
PDO Driver for SQLite 3.x enabled
SQLite Library 3.7.7.1
不管怎样,PDO 似乎不支持使用 SQLite3 使用这些类型的 INSERT 查询。
我的问题是是否有解决此问题的方法。我正在开发一个与 SQLite3 和 MySQL 兼容的应用程序。看到它们都支持多值插入,我讨厌只使用两种查询和插入逻辑,因为 PDO 不是最新的。
一些修改 - 添加代码细节:
打开数据库连接:
public function useSQLite3($file)
{
$dsn = "sqlite:$file";
$this->dbService = new PDO ($dsn);
$this->dbService->query('PRAGMA journal_mode=WAL;');
$this->dbService->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}
处理批量插入数据库的方法:
public function bulkInsertLink(array $links)
{
$insertRows = array();
$placeholders = array();
$j = 0;
$i=0;
foreach($links as $linkData) {
$placeholders[$j] = '(';
foreach($linkData as $columnData) {
$placeholders[$j] .= '?,';
$insertRows[$i] = $columnData;
$i++;
}
$placeholders[$j] = rtrim($placeholders[$j], ',');
$placeholders[$j] .= ')';
$j++;
}
$query = 'INSERT INTO links (status, date, lang, group_ID, group_link_ID, link, sitemap_link) VALUES ';
$query .= implode(',', $placeholders);
$preparedQuery = $this->dbService->prepare($query);
$preparedQuery->execute($insertRows);
}
$links 是一个数组,其中每个元素代表要插入的一行的信息。
【问题讨论】:
-
我希望我在几个小时前就遇到了这个问题。它会为我省去很多麻烦。我在 CentOS 6 系统上,使用多个
INSERT语句很容易。 -
我还可以补充一点,运行多个单独的
INSERT语句非常缓慢。解决方案是将这些语句包装在事务中。
标签: php pdo sqlite sql-insert