Doctrine TimeStamp Error: Importar tabelas do SQL Server 2008
Como importar uma tabela do SQL Server com um campo Timestamp com Doutrina? Quando os tutoriais aqui e ali não são suficientes, geralmente há apenas uma maneira de atingir seus objetivos... Suje as mãos! Hoje proponho uma solução, que espero seja rapidamente integrada pela Comunidade responsável pelo desenvolvimento do Doctrine, que permite criar entidades Symfony2 a partir de um banco de dados SQL Server que contém um campo do tipo Timestamp.
Qual é o tipo de carimbo de data/hora?
Parece-me necessário especificar algumas pequenas informações sobre o tipo Timestamp. Não sou um especialista em MySQL, mas pelas informações que encontrei, o carimbo de data/hora do MySQL parece uma data, o que facilita a conversão. No entanto, o mesmo tipo para SQL Server é um pouco mais sutil em seu entendimento. A documentação está disponível no Microsoft Technet.
Um tipo de dados que expõe números binários de um único caractere gerados automaticamente em um banco de dados.
Interessante… E como eu digo à Doutrina para não me converter? Proponho uma solução para desviar o problema...
Encontre uma solução “personalizada”
Já estou vendo as mensagens chegando me dizendo que já existe um método pronto que funciona. SIM ! Além disso, é esta tarefa do Symfony2 que pode ser chamada desta forma:
php app/console doutrina:mapping:import
Esta tarefa funciona bem, mas conforme li aqui, o Doctrine funciona para cerca de 70-80% dos mapeamentos possíveis em um banco de dados. No meu caso, eu queria exportar o mapeamento de uma tabela do SQL Server (2008), que continha o famoso campo TimeStamp. E nos 20% restantes dos mapeamentos, existem justamente esses tipos de campos.
Vou executar o comando e tentar importar o mappaqe.
|
|
No meu caso, tive que usar duas opções adicionais, a saber:
- –em=”…” para especificar oEntidade Gestora responsável pelo meu banco de dados SQL Server;
- --filter=”tabela”. Eu queria usar esta opção que funcionava com MariaDB, mas parecia ser ignorada quando usada com MSSQL. Isso permite que você especifique uma tabela para exportar. No meu caso, copiei meu BDD, apaguei as tabelas que não me interessavam e criei um novo perfil deEntidade Gestora.
E aqui está a exceção levantada:
|
|
De agora em diante, teremos que manipular os dados.
O tipo Timestamp não é suportado - e admito que realmente não sei a que tipo de campos PHP associá-lo - iremos temporariamente dizer ao Doctrine que este tipo deve ser convertido datetime.
- Vá para a pasta indicada pela estrutura em árvore, fornecedordoctrinedbalibDoctrineDBALPlatforms.
- Nesta pasta estão as classes para suportar a maioria dos SGBDs existentes.
- No meu caso eu estava trabalhando no SQL Server 2008 R2, então edito o arquivo SQLServer2008Platform.php, mas fique à vontade para editar outro arquivo se ele corresponder à sua configuração.
- Vamos editar o método initializeDoctrineTypeMappings. na variável doutrinaTipoMapeamento está presente a informação para converter os tipos. Adicione a linha:
$this->doctrineTypeMapping['timestamp'] = 'datetime'; - Reinicie a importação de mapeamento. O mapeamento de todos os campos foi importado.
- Você deve se lembrar de remover a linha que adicionou ao arquivo. Se você não tiver certeza, remova todos os fornecedores e reinstale-os.
- Agora vá sucessivamente para os arquivos que foram gerados. O caminho de cada um é indicado e, por sua vez, siga as indicações abaixo.
- Agora você tem o equivalente de suas tabelas em XML.
- Exclua as linhas que correspondem a um campo do tipo TimeStamp. Desta forma, o Doctrine irá ignorar estes campos.
- Uma pequena precaução com o SQL Server é adicionar colchetes ao redor de cada valor contido por "coluna" com um ou mais espaços.
Para esta linha,
A coluna do SQL Server é "Minhas informações". Doctrine não sabe como lidar com espaços com MSSQL. Então você precisa adicionar ganchos como este:
- Quando seus arquivos forem corrigidos, iniciamos a geração da entidade.
1php app/console doutrina:mapping:convert annotation ./src
Você pode precisar especificar o Entity Manager a ser usado, assim: –em=”…”.
- Agora você pode excluir o mapeamento, ou seja, os arquivos .xml presentes nos Recursos.
Pronto, agora você tem entidades válidas geradas pelo Doctrine. Essa solução um pouco… “brian fuck” é válida desde que a equipe responsável pelo desenvolvimento do Doctrine não tenha integrado uma solução viável que permitisse que o tipo TimeStamp fosse suportado nativamente dentro do PHP.
Boa sorte e até breve!