Las pruebas funcionales de Symfony/Doctrine que utilizan sqlite producen el error SQLSTATE[HY000]: General error: 1 near “(“: syntax error.
Tengo una aplicación Symfony que utiliza Doctrine y el paquete liiptestfixtures_bundle.
- Versión de PHP: 7.4.25
- Versión de Symfony Runtime: 5.3.11
- Doctrine DBAL: 3.2.0
Configuré Doctrine para que use una conexión sqlite para las pruebas. Al ejecutar las pruebas, obtengo el siguiente error:
Doctrine\DBAL\Exception\SyntaxErrorException: Se produjo una excepción al ejecutar una consulta: SQLSTATE[HY000]: Error general: 1 cerca de "(": error de sintaxis
Seguí el error hasta Doctrine\DBAL\Schema\SqliteSchemaManager::_getPortableTableIndexesList
donde se ejecuta la siguiente consulta “SELECT * FROM PRAGMATABLEINFO (?)”.
El siguiente ejemplo mínimo reproduce el problema. Ten en cuenta que solo utiliza PDO.
<?php
```
// configuración
$pdo = new PDO( 'sqlite:'.<strong>DIR</strong>.'/test.db');
$pdo->exec(<<<SQL
CREATE TABLE <code>test</code> (
<code>id</code> int(11) NOT NULL AUTO<em>INCREMENT,
<code>content</code> varchar(1000) COLLATE utf8</em>unicode<em>ci NOT NULL,
PRIMARY KEY (<code>id</code>),
) DEFAULT CHARSET=utf8 COLLATE=utf8</em>unicode_ci;
SQL);
// esta línea causa el error
$stmt = $pdo->prepare('SELECT * FROM PRAGMA<em>TABLE</em>INFO (?)');
if( !$stmt instanceof PDOStatement )
{
echo "Se produjo un error\n";
echo "\n";
echo "Código de error: ".$pdo->errorCode()."\n";
$info = $pdo->errorInfo();
foreach( $info as $k => $v )
{
echo " $k => $v\n";
}
exit(128);
}
echo "No se detectaron errores de sintaxis \n";
/// salida
Se produjo un error
Código de error: HY000
0 => HY000
1 => 1
2 => cerca de "(": error de sintaxis
¿Hay alguna forma de configurar Doctrine para que no use declaraciones preparadas para bases de datos SQLite?
davy.ai
Para configurar Doctrine para que no utilice declaraciones preparadas para bases de datos Sqlite, puedes deshabilitar el uso de declaraciones preparadas emuladas estableciendo la opción “emulate_prepares” como verdadera en la configuración de la base de datos Doctrine:
Con esta configuración, Doctrine no utilizará declaraciones preparadas para conexiones SQLite, lo que puede solucionar el problema de error de sintaxis que estás experimentando.