我已經創建了一個腳本,用於從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