Імпорт файлу в базу даних

Досить часто виникає потреба занесення інформації з файлів в базу даних. Одним із способів вирішення цієї задачі є: відкриття файлу, через підрядник зчитувати файл, розбивати рядок по разделителю і заносити в базу. Але в такому випадку може виникнути проблема в швидкості імпорту, якщо файл буде занадто великий.







Для вирішення даної проблеми можна скористатися оператором MySQL LOAD DATA INFILE. LOAD DATA INFILE дозволяє завантажувати інформацію з файлів з великою швидкістю, що нам і потрібно.

Але у цього методу я помітив свої плюси і мінуси:

  • - немає можливості відстежувати коректність даних, що вводяться
  • + швидкість завантаження вражає

Уявімо ситуацію, що нам потрібно вивантажувати в БД прайс-листи організацій. Для цього потрібно буде зробити форму з можливістю вибору файлу і кнопкою для занесення файлу в базу.

Для початку створимо таблицю tbl_price, де будемо зберігати інформацію про прайс-листі.

Імпорт файлу в базу даних

id_user буде зовнішнім ключем для зв'язку організації і прайс-листа.

Створимо файл який будемо імпортувати

створення моделі

Створюємо модель для таблиці tbl_price генератором коду gii. Додаємо метод імпорту файлу в клас моделі Price.







Розберемо докладніше команду LOAD DATA LOCAL INFILE.

LOCAL говорить про те, що файл буде братися з директорії клієнтського сервера, якщо ж написати просто LOAD DATA INFILE, то файл буде братися з директорії сервера SQL.

FIELDS TERMINATED BY говорить про те яким чином відокремлюються одна від одної поля в нашому випадку це «;» крапка з комою.

LINES TERMINATED BY говорить про те яким чином будуть розділятися рядки, у нас це символ переходу на новий рядок.

IGNORE 1 LINES кількість пропускаються рядків зверху, пропускаємо одну оскільки у нас є шапка, якщо заголовки стовпців не використовувати те можна цей параметр не писати.

Далі в дужках вказуємо ті параметри, які будуть заноситися в базу з файлу, ВАЖЛИВО вказати ту послідовність стовпців БД, яку вказали в файлі тобто якщо в базі стовпці йдуть «ціна», «кількість», «од-ізм» а в файлі імпорту «од-ізм», «ціна», «кількість» то в SQL запиті слід вказувати «од-ізм» , «ціна», «кількість».

Також при копіюванні файлу в базу даних може виникнути ситуація, коли в файлі імпорту зберігається не вся необхідна інформація. У нашому випадку це id організації кому належить прайс і час формування прайса. Для цього потрібно використовувати SET де ми присвоюємо date_price поточну дату і id_user id організації.

Оскільки коректність даних, що вводяться в цьому способі перевірити не можна (якщо можна, то поділіться як), то змінимо rules в нашій моделі.

Тут я створив сценарій import_csv, де ведеться контроль розширення обраного користувачем файлу. Розширення я вибрав csv, але воно може бути і іншим.

створення уявлення

Створимо клас уявлення Price і внесемо в нього наступний код.

Ну тут все просто, єдиний момент на який варто звернути увагу це

інакше поле activeFileField буде повертати пусте значення.

створення контролера

Створимо контролер PriceController і в ньому actionImport з наступним кодом.







Схожі статті