<rmcreative>

RSS

SQLite, временные таблицы и таблицы в памяти

8 января 2011

SQLite можно заставить работать без файлов прямо в памяти. В случае PHP и PDO для этого в качестве соединения указывается sqlite::memory::

$db = new PDO('sqlite::memory:');

В этом случае база существует в памяти ровно до закрытия соединения.

Если же указать в качестве соединения sqlite:, будет создан временный файл, который после закрытия соединения также будет удалён.

Оба типа соединения особенно полезны при написании модульных тестов, где как раз требуется частое создание и удаление баз данных.

Комментарии RSS

  1. №3676
    Porcelanosa
    Porcelanosa 08 янв. 2011 г., 9:17:30

    отличная идея - использование для тестов

  2. №3700
    Ti
    Ti 11 янв. 2011 г., 10:07:40

    однажды я баловался с базой данных :memory:
    интерес вызывало постоянное соединение (PDO::ATTR_PERSISTENT)

    <?php
    $db = new PDO('sqlite::memory:', '', '', array(
        PDO::ATTR_PERSISTENT=>true,
        PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
    ));
    $db->exec("CREATE TABLE IF NOT EXISTS test(microtime)");
    foreach($db->query("SELECT microtime FROM test", PDO::FETCH_COLUMN, 0) as $val) echo "$val\n";
    $db->prepare("INSERT INTO test(microtime) VALUES(?)")->execute(array(microtime(true)));

    такая база живет между соединениями для отдельных процессов PHP
    фишка оказалась бесполезной т.к. сервера обслуживаются несколькими процессами PHP, время от времени их перезапуская

  3. №3702
    Sam
    Sam 11 янв. 2011 г., 13:11:55

    Ну, не совсем бесполезна:

    • PHP можно запустить как CGI.
    • На PHP можно написать демона.
  4. №3703
    Ti
    Ti 11 янв. 2011 г., 13:22:38

    в FastCGI та же проблема нескольких процессов и процессы он тоже перезапускает
    CGI и вовсе живет одно соединение

    при демоне надобность в постоянном соединении отпадает: достаточно обычного соединения

  5. №3712
    Sam
    Sam 12 янв. 2011 г., 2:08:00

    Хм, ну, выходит тогда что бесполезно…

  6. №6194
    Роман
    Роман 06 мая 2012 г., 22:42:37

    А как создать временную таблицу из массива данных, чтобы было можно использовать ее в запросе? к примеру, mass_users_index во временную таблицу vt_mass_users_index, далее запрос вида select * from RoleTbl as RT inner join vt_mass_users_index as T on RT.index=T.index

  7. №6196
    Sam
    Sam 07 мая 2012 г., 12:25:44

    Роман, если речь про SQLite, то как написано в посте + CREATE TABLE + INSERT.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.