es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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:

    // Suponiendo que has definido los parámetros de conexión SQLite en config/packages/doctrine.yaml
    doctrine:
        dbal:
            connections:
                default:
                    driver: 'pdo_sqlite'
                    path: '%kernel.project_dir%/var/data.db'
                    # Establecer emulate_prepares como verdadero
                    options:
                        emulate_prepares: true
    

    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.

Comments are closed.