我已经创建了一个脚本,用于从CSV文件读取数据,检查数据库中是否已存在数据,如果没有,则导入它。如果数据确实存在(特定产品的代码),则需要从CSV文件更新其余信息。只从CSV导入不存在的数据到数据库
例如; 我有一个代码为WTW-2LT的会员,在我的CSV文件中命名为Alex和姓约翰逊。脚本检查是否存在代码为WTW-2LT的成员,名为Alex和Johnson Johnson已存在,是否存在,联系人详细信息和额外详细信息是否需要从脚本更新(其他详细信息,如主题和讲师也需要检查,所有的细节都在CSV中的一行中),如果它不存在,只需创建新成员。
我的脚本到目前为止,我至少用了其他检查以防止分心;
while ($row = fgetcsv($fp, null, ";")) {
if ($header === null) {
$header = $row;
continue;
}
$record = array_combine($header, $row);
$member = $this->em->getRepository(Member::class)->findOneBy([
'code' =>$record['member_code'],
'name' =>$record['name'],
'surname' =>$record['surname'],
]);
if (!$member) {
$member = new Member();
$member->setCode($record['member_code']);
$member->setName($record['name']);
$member->setName($record['surname']);
}
$member->setContactNumber($record['phone']);
$member->setAddress($record['address']);
$member->setEmail($record['email']);
$subject = $this->em->getRepository(Subject::class)->findOneBy([
'subject_code' => $record['subj_code']
]);
if (!$subject) {
$subject = new Subject();
$subject->setCode($record['subj_code']);
}
$subject->setTitle($record['subj_title']);
$subject->setDescription($record['subj_desc']);
$subject->setLocation($record['subj_loc']);
$lecturer = $this->em->getRepository(Lecturer::class)->findOneBy([
'subject' => $subject,
'name' => $record['lec_name'],
'code' => $record['lec_code'],
]);
if (!$lecturer) {
$lecturer = new Lecturer();
$lecturer->setSubject($subject);
$lecturer->setName($record['lec_name']);
$lecturer->setCode($record['lec_code']);
}
$lecturer->setEmail($record['lec_email']);
$lecturer->setContactNumber($record['lec_phone']);
$member->setLecturer($lecturer);
$validationErrors = $this->validator->validate($member);
if (!count($validationErrors)) {
$this->em->persist($member);
$this->em->flush();
} else {
// ...
}
}
您可以注意到,此脚本必须查询数据库3次以检查是否存在一个CSV行。在我的情况下,我有多达2000多行的文件,因此每一行执行3个查询来检查该行是否存在是非常耗时的。
不幸的是,我也无法批量导入行,因为如果一个主题不存在,它会创建它很多次,直到批处理被刷新到数据库,然后我坐在重复记录中,没有服务点。
如何将性能和速度提高到最大?像首先从数据库中获取所有记录并将其存储在数组中(内存消耗?),然后执行检查并将该行添加到数组中,并从那里检查...
有人可以帮我找到一种方法提高这个(请用示例代码?)
嗯,好吧,我想我只需要使用'set_time_limit',因为超时大多是问题。 – Mentos93
如果您不想更改时间限制,则可以创建脚本将行转换为单个SQL查询。将查询保存为txt文件并将其上传到服务器。使用php,您可以从文件中读取X行,在数据库上运行它们并保存最后一行。比下一次继续从那一行。然而,以这种方式做更多的工作,但它会平衡更多的服务器负载。 – Jeffrey