Эта ошибка возникает в двух вариантах:
$arr = [1, 2, 3];
Синтаксис инициализатора этого массива был введен только в PHP 5.4; это приведет к возникновению ошибки парсера в версиях до этого. Если возможно, обновите свою установку или используйте старый синтаксис:
$arr = array(1, 2, 3);
См. Также этот пример из руководства.
$suffix = explode(',', 'foo,bar')[1];
Результаты функции разыменования массива также были введены в PHP 5.4. Если обновление невозможно, вам нужно использовать временную переменную:
$parts = explode(',', 'foo,bar');
$suffix = $parts[1];
См. Также этот пример из руководства.
Можно также попробовать тонкая настройка нескольких параметров для вытаскивания дополнительной скорости из него. Конкретно Вы, вероятно, хотите PRAGMA synchronous = OFF;
.
Увеличение PRAGMA default_cache_size
к намного большему числу. Это увеличит число страниц, кэшируемых в памяти.
Обертка все вставляет в единственную транзакцию, а не одну транзакцию на строку.
PRAGMA synchronous = OFF;
. В зависимости от размера данных и суммы доступной RAM, одно из лучшего увеличения производительности произойдет путем установки sqlite для использования базы данных все-в оперативной памяти вместо того, чтобы писать в диск.
Для баз данных в оперативной памяти, передайте ПУСТОЙ УКАЗАТЕЛЬ как аргумент имени файла sqlite3_open
, и удостоверяются, что TEMP_STORE определяется соответственно
(Весь вышеупомянутый текст извлечен от моего собственного ответа до отдельный sqlite-связанный вопрос )
Вы хотите использовать .import
команда. Например:
$ cat demotab.txt
44 92
35 94
43 94
195 49
66 28
135 93
135 91
67 84
135 94
$ echo "create table mytable (col1 int, col2 int);" | sqlite3 foo.sqlite
$ echo ".import demotab.txt mytable" | sqlite3 foo.sqlite
$ sqlite3 foo.sqlite
-- Loading resources from /Users/ramanujan/.sqliterc
SQLite version 3.6.6.2
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from mytable;
col1 col2
44 92
35 94
43 94
195 49
66 28
135 93
135 91
67 84
135 94
Обратите внимание, что эта команда массовой загрузки не SQL, а пользовательская функция SQLite. Как таковой, он имеет странный синтаксис, потому что мы передаем его через echo
интерактивному интерпретатору командной строки, sqlite3
.
В PostgreSQL эквивалентом является COPY FROM
:
http://www.postgresql.org/docs/8.1/static/sql-copy.html
В MySQL это ЛОКАЛЬНЫЙ ИНФИЛЬ ЗАГРУЗКИ ДАННЫХ
:
http://dev.mysql.com/doc/refman/5.1/ru/load-data.html
И последнее: не забывайте соблюдать осторожность со значением .separator
. Это очень распространенная ошибка при массовых вставках.
sqlite> .show .separator
echo: off
explain: off
headers: on
mode: list
nullvalue: ""
output: stdout
separator: "\t"
width:
Вы должны явно установить разделитель в качестве пробела, табуляции или запятой перед выполнением .import
.
Если вы просто вставляете один раз, у меня может быть грязный трюк для вас.
Идея проста: сначала вставить в базу данных памяти, затем сделать резервную копию и, наконец, восстановить исходный файл базы данных.
Я написал подробные шаги в моем блоге. :)
.Нет возможности наборов вставки, но Есть способ написать большие куски в память, затем примите их к база данных. Для API C / C ++ просто делай:
SQLite3_Exec (DB, «Начать транзакцию», NULL, NULL, NULL);
... (Вставить утверждения)
SQLite3_Exec (DB, «Commit Transaction», NULL, NULL, NULL);
Предполагая, что DB - ваш указатель базы данных.
RE: «Есть ли более быстрый способ создания операторов вставки для каждой строки данных?»
Во-первых: сократите его до 2 операторов SQL, используя Sqlite3 API виртуальных таблиц , например.
create virtual table vtYourDataset using yourModule;
-- Bulk insert
insert into yourTargetTable (x, y, z)
select x, y, z from vtYourDataset;
Идея заключается в том, что вы реализуете интерфейс C, который считывает ваш исходный набор данных и представляет его в SQlite как виртуальную таблицу, а затем вы выполняете SQL-копию из исходной таблицы в целевую за один раз. Это звучит сложнее, чем есть на самом деле, и таким образом я измерил огромные улучшения скорости.
Во-вторых: воспользуйтесь другим советом, приведенным здесь, то есть настройками прагмы и использованием транзакции.
В-третьих: возможно, посмотрите, сможете ли вы избавиться от некоторых индексов целевой таблицы. Таким образом, sqlite будет иметь меньше индексов для обновления для каждой вставленной строки