您当然可以运行控制台命令。但 Doctrine 2 不适合批量操作,很快就会耗尽 gas。
我有一个使用 PDO 的进程,它会定期扫描包含 110K 记录的 csv 文件并更新多达五个不同的表。即使在我每月 5 美元的共享主机服务器上也能正常运行。
制作 PDO 服务:
# =============================================================
pdo:
class: PDO
arguments:
dsn: '%database_dsn%' # mysql:dbname=appgames
user: '%database_user%'
password: '%database_password%'
calls:
- [setAttribute, [ 3, 2]] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION
- [setAttribute, [19, 2]] # \PDO::ATTR_DEFAULT_FETCH_MODE \PDO::FETCH_ASSOC
- [setAttribute, [20, 0]] # \PDO::ATTR_EMULATE_PREPARES
准备一些语句:
public function prepareLevelInsert()
{
$key = 'levelInsert';
if (isset($this->prepared[$key])) return $this->prepared[$key];
$sql = <<<EOT
INSERT INTO levels
( id, name, sport, domain, domainSub, status)
VALUES (:key,:name,:sport,:domain,:domainSub, 'Active')
;
EOT;
return $this->prepared[$key] = $this->conn->prepare($sql);
}
然后扫描你的文件
// $conn is the PDO object or a
// DBAL connection object obtained from $entityManager->getConnection();
$conn->beginTransaction();
while($row = fgetcsv($fp))
{
// Pull level data
$level = array('name' => $row['levelName'] ... rest of values ...);
// And insert
$this->prepareLevelInsert()->execute($level);
}
$conn->commit();
也许有点乏味,但比使用 Doctrine 2 快很多。