Doctrine TimeStamp Error: importa tabelle di SQL Server 2008
Come importare una tabella di SQL Server con un campo Timestamp con Dottrina? Quando i tutorial qua e là non bastano, spesso c'è solo un modo per raggiungere i tuoi obiettivi... Sporcati le mani! Oggi propongo una soluzione, che spero venga rapidamente integrata dalla Community incaricata dello sviluppo di Doctrine, che permette di creare entità Symfony2 da un database SQL Server che contengano un campo di tipo Timestamp.
Qual è il tipo di timestamp?
Mi sembra necessario specificare alcune piccole informazioni sul tipo Timestamp. Non sono un esperto di MySQL, ma dalle informazioni che ho trovato, il MySQL Timestamp sembra una data, il che rende più facile la conversione. Tuttavia, lo stesso tipo per SQL Server è un po' più sottile nella sua comprensione. La documentazione è disponibile su Microsoft Technet.
Un tipo di dati che espone numeri binari a carattere singolo generati automaticamente in un database.
Interessante... E come faccio a dire a Doctrine di non convertirmi? Propongo una soluzione per deviare il problema...
Trova una soluzione "su misura".
Vedo già arrivare i messaggi che mi dicono che esiste già un metodo già pronto che funziona. SI! Inoltre, è questo task di Symfony2 che può essere chiamato in questo modo:
php app/console dottrina:mappatura:importazione
Questa attività funziona bene, ma come ho letto qui, Doctrine funziona per circa il 70-80% delle possibili mappature su un database. Nel mio caso ho voluto esportare la mappatura di una tabella di SQL Server (2008), che conteneva un famoso campo TimeStamp. E nel restante 20% delle mappature ci sono proprio questi tipi di campi.
Eseguirò il comando e tenterò di importare la mappaqe.
|
|
Nel mio caso, ho dovuto utilizzare due opzioni aggiuntive, vale a dire:
- –em=”…” per specificare ilResponsabile dell'ente responsabile del mio database SQL Server;
- --filter=”tabella”. Volevo usare questa opzione che funzionava con MariaDB ma sembrava essere ignorata se usata con MSSQL. Ciò consente di specificare una tabella da esportare. Nel mio caso avevo copiato il mio BDD, avevo cancellato le tabelle che non mi interessavano e creato un nuovo profilo diResponsabile dell'ente.
Ed ecco l'eccezione sollevata:
|
|
D'ora in poi, dovremo truccare i dadi.
Il tipo Timestamp non è supportato - e ammetto di non sapere davvero a quale tipo di campi PHP associarlo - diremo temporaneamente a Doctrine che questo tipo deve essere convertito datetime.
- Vai alla cartella indicata dalla struttura ad albero, vendordoctrinedbalibDoctrineDBALPlatforms.
- In questa cartella ci sono le classi per supportare la maggior parte dei DBMS esistenti.
- Nel mio caso stavo lavorando su SQL Server 2008 R2, quindi modifico il file SQLServer2008Platform.php, ma sentiti libero di modificare un altro file se corrisponde alla tua configurazione.
- Modificheremo il metodo initializeDoctrineTypeMappings. In variabile dottrinaTypeMapping sono presenti le informazioni per convertire i tipi. Aggiungi la riga:
$this->doctrineTypeMapping['timestamp'] = 'datetime'; - Riavvia l'importazione della mappatura. La mappatura di tutti i campi è stata importata.
- Devi ricordarti di rimuovere la riga che hai aggiunto al file. Se non sei sicuro, rimuovi tutti i fornitori e reinstallali.
- Ora vai successivamente ai file che sono stati generati. Il percorso di ciascuno è indicato e, a sua volta, seguire le indicazioni di seguito.
- Ora hai l'equivalente delle tue tabelle in XML.
- Elimina le righe che corrispondono a un campo di tipo TimeStamp. In questo modo, Doctrine ignorerà questi campi.
- Una piccola precauzione con SQL Server consiste nell'aggiungere parentesi attorno a ciascun valore contenuto da "colonna" con uno o più spazi.
Per questa linea,
La colonna di SQL Server è "My Infos". Doctrine non sa come gestire gli spazi con MSSQL. Quindi è necessario aggiungere hook come questo:
- Quando i tuoi file sono stati corretti, lanciamo la generazione di entità.
1php app/console dottrina:mappatura:converti annotazione ./src
Potrebbe essere necessario specificare l'Entity Manager da utilizzare, in questo modo: –em=”…”.
- Ora puoi eliminare la mappatura, ovvero i file .xml presenti nelle Risorse.
Ecco fatto, ora hai entità valide generate da Doctrine. Questa soluzione, un po'... "brian fuck", è valida fintanto che il team incaricato di sviluppare Doctrine non ha integrato una soluzione percorribile che permetta di supportare nativamente il tipo TimeStamp all'interno di PHP.
Buona fortuna e a presto!