【问题标题】:Multi-valued INSERT for SQLite3 using PDO使用 PDO 的 SQLite3 的多值插入
【发布时间】: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


【解决方案1】:

使用 PDO,您可以像这样进行多值插入:

$statement = $pdo->prepare('INSERT INTO t VALUES (?, ?), (?, ?)');
$pdo->execute([1, 2, 3, 4]);

但我个人准备了一个插入语句,并使用不同的参数多次执行。

【讨论】:

  • 感谢您的回复。我知道如何制作多插件。问题是当 PDO 使用 SQLite3 时它们不起作用,如上所述。我一直在寻找解决方法。
  • 试试这个代码,它在我身边有效: exec('CREATE TABLE t (r1 int, r2 int)'); $statement = $pdo->prepare('INSERT INTO t VALUES (?, ?), (?, ?)'); $语句->执行([1, 2, 3, 4]); foreach($pdo->query('SELECT * FROM t') as $row) { print_r($row); };
  • 您能告诉我您使用的是什么 SQLite3 PDO 驱动程序吗?我做了类似的事情(将更新原始消息),但它似乎对我不起作用)
  • PhpInfo 声明如下:pdo_sqlite PDO Driver for SQLite 3.x => 启用 SQLite 库 => 3.8.4.3
  • 谢谢。大概这就是区别所在。我将更新我的 SQLite 库,不过根据他们的网站,3.7.7.1 版是引入多值插入的版本。
猜你喜欢
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
相关资源
最近更新 更多