Таблица базы данных SQLite заблокирована в модульном тесте - PullRequest
0 голосов
/ 25 апреля 2020

Я работаю на уровне sqlite для легкой обработки sql запросов. Соединение выполняется с PDO, и в первую очередь я выполняю этот запрос для настройки параметров:
$this->_db->exec('PRAGMA synchronous=FULL; PRAGMA journal_mode=WAL; PRAGMA temp_store=MEMORY; PRAGMA locking_mode=EXCLUSIVE; PRAGMA busy_timeout=5000;');
У меня есть функция для создания таблицы, вот как это выглядит:

public function createTable($table, $struct, $drop_flag=true) { 
    $this->_db->beginTransaction();
    if ($drop_flag && $this->tableExists($table)) {
        $this->query("DROP TABLE ".$table); // <---- This is the point by the unit tests where it comes to that error
    }
    $query = [];
    $index = [];
    foreach ($struct as $name => $type) {
        $key = explode(' ', $name);
        if (sizeof($key) == 1) {
            $query[] = $name . ' ' . $this->_convertType($type);
        } else {
            $val = explode('(', rtrim($type, ')'));
            switch ($key[0]) {
                case 'PRIMARY':
                case 'UNIQUE':
                case 'KEY':
                    $index_name = $table.'_'.$key[1];
                    $index[] = 'CREATE ' . ($key[0] == 'UNIQUE' ? 'UNIQUE ' : '')
                             . 'INDEX ' . $index_name . ' ON ' . $table
                             . ' ("' . str_replace(',', '","', $val[0]) . '")';
                    break;
            }
            if ($key[0] == 'PRIMARY') {
                $columns = explode(',', $type);
                $primaries = [];
                foreach ($columns as $value) {
                    if (strpos($value, '(')) {
                        $primaries[] = substr($value, 0, strpos($value, '('));
                    } else {
                        $primaries[] = $value;
                    }
                }
                $query[] = 'PRIMARY KEY (' . implode(',', $primaries) . ')';
            }
        }
    }
    $stmt = $this->query('create table ' . $table . ' (' . implode(',', $query) . ');');
    if ($stmt === false) {
        $this->_db->rollback();
        throw new Own_Sql_Exception($query . "\n" . $this->_db->errorInfo()[2], Own_Sql_Exception::QUERY_ERROR);
    }
    foreach ($index as $in) {
        $this->query($in, true);
    }
    $this->_db->commit();
}

Эта функция работает отлично, но когда я запускаю свой модульный тест с phpunit, я получаю сообщение об ошибке: SQLSTATE [HY000]: Общая ошибка: 6 таблица базы данных заблокирована.
Вот код функции моего модульного теста:

public function testCreateTable() {
    $db = new_db_connection();
    $this->start = microtime(true);
    $db->createTable('test', array(
        'id' => 'int',
        'name' => 'varchar(255)',
        'PRIMARY KEY' => 'id'
    ));
    $createQuery = $db->currentQuery;
    $this->assertTrue($db->tableExists('test'), $createQuery); 
    $cols = $db->showColumns('test');
    $this->assertEquals(2, sizeof($cols));

    $db->createTable('test', array( // <---- Here is the point where i got the error
        'id' => 'int',
        'name' => 'varchar(255)',
        'title' => 'varchar(255)',
        'PRIMARY KEY' => 'id'
    ));
    $cols = $db->showColumns('test');
    $this->assertEquals(3, sizeof($cols));

    $db->createTable('test', array(
        'id' => 'int',
        'name' => 'varchar(255)',
        'title' => 'varchar(255)',
        'order_field' => 'int',
        'PRIMARY KEY' => 'id'
    ), true);
    $cols = $db->showColumns('test');
    $this->assertEquals(4, sizeof($cols));
}

Кто-нибудь знает, как исправить эту ошибку?

...