Вставлення даних CSV в SQLite в PHP PDO - чи є якийсь швидший спосіб, ніж вставити рядок за рядком?

Я шукаю ефективний метод для вставки даних CSV в базу даних SQLite на віддаленому сервері.

Я повинен використовувати PHP. Я використовую SQLite3, тому я повинен використовувати PDO (sqlite_query не буде працювати).

CSV знаходиться на стороні сервера і має 100000 + рядків (50 Мб + файлів).

Питання: чи існує якийсь спосіб для PHP швидше, ніж це?

for (/* each row, 100.000 rows */)
{
    $a = 'something';
    $b = 'something';
    $query = $link->prepare("INSERT INTO user_info (a, b) VALUES (?, ?)");
    $query->bindParam(1, $a);
    $query->bindParam(2, $b);
    $query->execute();
}

Мій файл SQL знаходиться в тому ж каталозі.

Я читав про команду .import , але я не знаю, як використовувати його з PDO (чи слід використовувати готувати ?) шлях повинен виглядати?).

Im новий для PDO і SQLite.

0
@KingCrunch його не дублювати .. що, якщо вам потрібно фільтрувати недійсні значення? Надане посилання може працювати лише для надійних значень
додано Автор Baba, джерело
Прочитайте її, а потім напишіть. В чому проблема?
додано Автор KingCrunch, джерело
Прочитайте її, а потім напишіть. В чому проблема?
додано Автор KingCrunch, джерело
додано Автор KingCrunch, джерело
додано Автор KingCrunch, джерело
@Baba Це буде щось інше, але питання не містить "фільтра", він містить "вставку CSV в базу даних SQLite". Крім того, згадані операційні системи згадували сам .import . Якщо ви маєте рацію, ОП повинна роз'яснити своє питання, інакше це дублікат :)
додано Автор KingCrunch, джерело
@Baba Це буде щось інше, але питання не містить "фільтра", він містить "вставку CSV в базу даних SQLite". Крім того, згадані операційні системи згадували сам .import . Якщо ви маєте рацію, ОП повинна роз'яснити своє питання, інакше це дублікат :)
додано Автор KingCrunch, джерело

7 Відповіді

$link->beginTransaction();

$query = $link->prepare("INSERT INTO user_info (a, b) VALUES (?, ?)");
for (/* each row, 100.000 rows */)
{
//variable stuff + execute query
}

$link->commit();

Це виконує запису, поки після циклу - набагато швидше. Вам потрібно створити об'єкт db так:     $ link = new PDO ('sqlite: your.db');

edit: Корекція вводу/вставки

2
додано
Крім того, варто відзначити, що це не може призвести до того самого прискорення в інших системах БД - насправді, навпаки, оскільки СУБД повинна буде підтримувати більш високий рівень ізоляції, або придбати замок або підтримувати тимчасовий варіант дані.
додано Автор IMSoP, джерело
$link->beginTransaction();

$query = $link->prepare("INSERT INTO user_info (a, b) VALUES (?, ?)");
for (/* each row, 100.000 rows */)
{
//variable stuff + execute query
}

$link->commit();

Це виконує запису, поки після циклу - набагато швидше. Вам потрібно створити об'єкт db так:     $ link = new PDO ('sqlite: your.db');

edit: Корекція вводу/вставки

2
додано
Крім того, варто відзначити, що це не може призвести до того самого прискорення в інших системах БД - насправді, навпаки, оскільки СУБД повинна буде підтримувати більш високий рівень ізоляції, або придбати замок або підтримувати тимчасовий варіант дані.
додано Автор IMSoP, джерело

Ну, я не знаю, чи існує об'ємний підхід з SQLite, який можна використовувати через драйвер PDO, але ви повторно готуєте одне й те саме твердження на кожному циклі.

Це, напевно, буде більш ефективним:

$query = $link->prepare("INSERT INTO user_info (a, b) VALUES (?, ?)");
for (/* each row, 100.000 rows */)
{
    $a = 'something';
    $b = 'something';

    $query->bindParam(1, $a);
    $query->bindParam(2, $b);
    $query->execute();
}
0
додано
Право. А як же масиви? Я маю масив так: $ data [$ row] [$ cell]. Чи можна якось прив'язати елемент масиву? Я маю на увазі динамічний індекс рядка. У мене були проблеми з елементами зв'язування масиву в C# і MSSQL, і не використовував тут масив.
додано Автор Kamil, джерело
Не зважай. Кращої відповіді немає, так ...
додано Автор Kamil, джерело
Я не впевнений, що ви маєте на увазі.
додано Автор IMSoP, джерело

Read about transactions. Start using transactions. Use search before asking. This is the answer.

0
додано

Read about transactions. Start using transactions. Use search before asking. This is the answer.

0
додано

Я новачок в SO, тому не впевнений у процесі, я подав прапор, але тим часом я думаю, що це те, що вам потрібно

Масове завантаження даних у sqlite?

0
додано

Я новачок в SO, тому не впевнений у процесі, я подав прапор, але тим часом я думаю, що це те, що вам потрібно

Масове завантаження даних у sqlite?

0
додано
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php