Error de marca de tiempo de Doctrine: importar tablas de SQL Server 2008
Agencia web » Noticias digitales » Error de marca de tiempo de Doctrine: importar tablas de SQL Server 2008

Error de marca de tiempo de Doctrine: importar tablas de SQL Server 2008

Cómo importar una tabla de SQL Server con un campo Timestamp con la doctrina? Cuando los tutoriales aquí y allá no son suficientes, a menudo solo hay una forma de lograr sus fines... ¡Ensúciate las manos! Hoy propongo una solución, que espero sea rápidamente integrada por la Comunidad a cargo del desarrollo de Doctrine, que permite crear entidades Symfony2 a partir de una base de datos de SQL Server que contienen un campo de tipo Timestamp.

¿Qué es el tipo de marca de tiempo?

Me parece necesario especificar algunos pequeños datos sobre el tipo Timestamp. No soy un experto en MySQL, pero según la información que he encontrado, MySQL Timestamp parece una fecha, lo que facilita la conversión. Sin embargo, el mismo tipo para SQL Server es un poco más sutil en su comprensión. La documentación está disponible en Microsoft Technet.

Un tipo de datos que expone números binarios de un solo carácter generados automáticamente en una base de datos.
Interesante… ¿Y cómo le digo a Doctrine que no me convierta? Propongo una solución para desviar el problema...

Encuentre una solución "personalizada"

Ya puedo ver los mensajes que me dicen que ya hay un método listo para usar que funciona. SÍ! Además, es esta tarea de Symfony2 la que se puede llamar de esta manera:

aplicación php/doctrina de la consola: mapeo: importar
Esta tarea funciona bien, pero como leí aquí, Doctrine funciona para alrededor del 70-80% de las asignaciones posibles en una base de datos. En mi caso, quería exportar el mapeo de una tabla de SQL Server (2008), que contenía un famoso campo TimeStamp. Y en el 20% restante de los mapeos, existen precisamente este tipo de campos.

Ejecutaré el comando e intentaré importar el paquete de mapas.

1
aplicación php/doctrina de la consola: mapeo: importar —forzar NamespaceNameBundle xml

En mi caso, tuve que usar dos opciones adicionales, a saber:

  1. –em=”…” para especificar elGerente de entidad a cargo de mi base de datos SQL Server;
  2. --filtro=”tabla”. Quería usar esta opción que funcionaba con MariaDB pero parecía ignorarse cuando se usaba con MSSQL. Esto le permite especificar una tabla para exportar. En mi caso, había copiado mi BDD, había borrado las tablas que no me interesaban y creado un nuevo perfil deGerente de entidad.
    Y aquí está la excepción planteada:
1
2
[DoctrinaDBALDBALExcepción]
base de datos desconocida tipo fecha y hora solicitada, es posible que DoctrineDBALPlatformsSQLServer2008Platform no la admita.

De ahora en adelante, vamos a tener que amañar los dados.
El tipo de marca de tiempo no es compatible, y admito que no sé con qué tipo de campos PHP asociarlo. Le diremos temporalmente a Doctrine que este tipo debe convertirse datetime.

  • Vaya a la carpeta indicada por la estructura de árbol, proveedordoctrinedbalibDoctrineDBALPlataformas.
  • En esta carpeta están las clases para soportar la mayoría de DBMS existentes.
  • En mi caso estaba trabajando en SQL Server 2008 R2, entonces edite el archivo Plataforma SQLServer2008.php, pero no dude en editar otro archivo si coincide con su configuración.
  • Editaremos el método. inicializarDoctrineTypeMappings. en variables asignación de tipo de doctrina está presente la información para convertir los tipos. Agregue la línea:
    $this->doctrineTypeMapping['timestamp'] = 'datetime';
  • Reinicie la importación de mapas. Se ha importado la asignación de todos los campos.
  • Debe recordar eliminar la línea que agregó al archivo. Si no está seguro, elimine todos los proveedores y vuelva a instalarlos.
  • Ahora vaya sucesivamente a los archivos que se han generado. Se indica el camino de cada uno, ya su vez, seguir las indicaciones a continuación.
    • Ahora tiene el equivalente de sus tablas en XML.
    • Elimine las líneas que correspondan a un campo de tipo TimeStamp. De esta forma, Doctrine ignorará estos campos.
    • Una pequeña precaución con SQL Server es agregar corchetes alrededor de cada valor contenido en "columna" que tenga uno o más espacios.
      Para esta línea,

      La columna de SQL Server es "Mi información". Doctrine no sabe cómo manejar espacios con MSSQL. Entonces necesitas agregar ganchos como este:
  • Cuando sus archivos han sido corregidos, lanzamos la generación de entidades.
    1
    aplicación php/doctrina de la consola: mapeo: convertir anotación ./src

Es posible que deba especificar el Entity Manager para usar, así: –em=”…”.

  • Ahora puede eliminar la asignación, es decir, los archivos .xml presentes en los Recursos.
    Eso es todo, ahora tienes entidades válidas generadas por Doctrine. Esta solución un poco… “brian joder” es válida siempre y cuando el equipo responsable del desarrollo de Doctrine no haya integrado una solución viable que permitiera soportar de forma nativa el tipo TimeStamp dentro de PHP.

¡Buena suerte y hasta pronto!

★ ★ ★ ★ ★