pdo\pgsql 的 copyfromfile() 是 php 8.4 引入的新扩展,旨在替代旧版 pdo::pgsqlcopyfromfile()。主要区别在于返回值类型、错误处理机制以及底层实现:新版方法返回 pdo\pgsql\copyresult 对象以提供详细的统计信息(如成功行数),而旧版仅返回布尔值;新版默认使用更安全的二进制协议并支持流式传输,旧版则依赖文本协议且容易受限于内存。

Pdo\Pgsql 如何实例化与基础调用
要使用新特性,首先需要确保 PHP 版本为 8.4+ 并加载 Pdo\Pgsql 扩展。该扩展通过 Pdo\Pgsql\Driver 进行连接,取代了传统的 pdo_pgsql 驱动。在建立连接后,可以直接调用 copyFromFile() 方法。该方法接受文件名或路径作为参数,并自动处理文件读取和 PostgreSQL 的 COPY 命令执行。

$driver = new Pdo\Pgsql\Driver('host=localhost dbname=test user=postgres password=secret');
$pdo = $driver->createConnection();
$result = $pdo->copyFromFile('data.csv', 'table_name');
上述代码展示了最基础的调用方式。注意,这里使用的是 Pdo\Pgsql\Driver 而非旧的 Pdo 构造函数直接指定驱动。执行后,$result 将包含操作结果。如果文件不存在或权限不足,会抛出异常而非返回 false。
新旧版本在错误处理和返回值上的差异
旧版 PDO::pgsqlCopyFromFile() 在失败时返回 false,开发者必须通过 PDO::errorInfo() 获取详细错误信息,这增加了错误处理的复杂性。新版 Pdo\Pgsql\copyFromFile() 严格遵循现代 PHP 的异常处理模式,任何错误都会抛出 Pdo\Exception。此外,它返回的对象提供了 getRowCount() 等方法,让开发者能精确知道有多少行数据被成功导入,这是旧版无法做到的。

try {
$result = $pdo->copyFromFile('invalid_path.csv', 'table_name');
} catch (Pdo\Exception $e) {
echo "Error: " . $e->getMessage();
}
这段代码演示了新版如何处理错误。当文件路径无效时,程序不会静默失败,而是直接进入 catch 块。相比之下,旧版代码需要额外的判断逻辑:if (!$pdo->pgsqlCopyFromFile(...)) { ... }。新版的返回值对象还允许检查 getRowCount(),例如 echo $result->getRowCount();,从而验证数据是否完整导入。
基于 getRowCount() 的具体问题:如何验证导入行数?
在实际开发中,验证数据是否完全导入至关重要。新版 API 提供的 getRowCount() 方法直接返回成功插入的行数。如果导入的文件有 1000 行,但只有 999 行成功,可以通过比较预期行数与实际返回值来发现数据丢失或格式错误。旧版 API 无法提供此粒度,只能知道“成功”或“失败”。











