Doctrine TimeStamp-fout: SQL Server 2008-tabellen importeren
Hoe een SQL Server-tabel met een veld te importeren Tijdstempel met leer? Als de tutorials hier en daar niet genoeg zijn, is er vaak maar één manier om je doel te bereiken... Maak je handen vuil! Vandaag stel ik een oplossing voor, waarvan ik hoop dat deze snel zal worden geïntegreerd door de gemeenschap die verantwoordelijk is voor de ontwikkeling van Doctrine, waarmee Symfony2-entiteiten kunnen worden gemaakt op basis van een SQL Server-database die een veld van het type Tijdstempel.
Wat is het type tijdstempel?
Het lijkt mij noodzakelijk om wat kleine informatie over het type tijdstempel te specificeren. Ik ben geen MySQL-expert, maar uit informatie die ik ben tegengekomen, ziet de MySQL-tijdstempel eruit als een datum, waardoor het gemakkelijker te converteren is. Hetzelfde type voor SQL Server is echter iets subtieler in zijn begrip. De documentatie is beschikbaar op Microsoft Technet.
Een gegevenstype dat automatisch gegenereerde binaire getallen van één teken in een database weergeeft.
Interessant... En hoe zeg ik tegen Doctrine dat ze me niet moet bekeren? Ik stel een oplossing voor om het probleem af te leiden...
Zoek een "maatwerk" oplossing
Ik zie de berichten al aankomen dat er al een kant-en-klare methode is die werkt. YES! Bovendien is het deze Symfony2-taak die op deze manier kan worden aangeroepen:
php app/console doctrine:mapping:import
Deze taak werkt prima, maar zoals ik hier lees, werkt Doctrine voor ongeveer 70-80% van de mogelijke mappings op een database. In mijn geval wilde ik de toewijzing van een SQL Server-tabel (2008) exporteren, die een beroemd tijdstempelveld bevatte. En in de overige 20% van de mappings zitten precies dit soort velden.
Ik zal de opdracht uitvoeren en proberen de mappaqe te importeren.
|
|
In mijn geval moest ik twee extra opties gebruiken, namelijk:
- –em=”…” om de te specificerenEntiteitsmanager verantwoordelijk voor mijn SQL Server-database;
- --filter=”tabel”. Ik wilde deze optie gebruiken die werkte met MariaDB, maar leek te worden genegeerd bij gebruik met MSSQL. Hiermee kunt u een tabel specificeren om te exporteren. In mijn geval had ik mijn BDD gekopieerd, ik had de tabellen verwijderd die me niet interesseerden en een nieuw profiel van gemaaktEntiteitsmanager.
En hier is de uitzondering:
|
|
Vanaf nu zullen we de dobbelstenen moeten manipuleren.
Het type Timestamp wordt niet ondersteund - en ik geef toe dat ik niet echt weet met welk type PHP-velden ik het moet associëren - we zullen Doctrine tijdelijk vertellen dat dit type moet worden geconverteerd datetime.
- Ga naar de map aangegeven door de boomstructuur, vendordoctrinedbalibDoctrineDBALPlatforms.
- In deze map bevinden zich de klassen die de meeste bestaande DBMS ondersteunen.
- In mijn geval werkte ik aan SQL Server 2008 R2, dus ik bewerk het bestand SQLServer2008Platform.php, maar voel je vrij om een ander bestand te bewerken als het overeenkomt met je configuratie.
- We zullen de methode bewerken initialiseer DoctrineTypeMappings. Variabel doctrineTypeMapping is de informatie aanwezig om de typen om te zetten. Voeg de regel toe:
$this->doctrineTypeMapping['timestamp'] = 'datetime'; - Start de mapping-import opnieuw. De mapping van alle velden is geïmporteerd.
- U moet niet vergeten de regel te verwijderen die u aan het bestand hebt toegevoegd. Als u het niet zeker weet, verwijdert u alle leveranciers en installeert u ze opnieuw.
- Ga nu achtereenvolgens naar de bestanden die zijn gegenereerd. Het pad van elk is aangegeven en volg op zijn beurt de onderstaande aanwijzingen.
- U hebt nu het equivalent van uw tabellen in XML.
- Verwijder de regels die overeenkomen met een veld van het type Tijdstempel. Op deze manier negeert Doctrine deze velden.
- Een kleine voorzorgsmaatregel bij SQL Server is het toevoegen van vierkante haken rond elke waarde die wordt weergegeven door "kolom" met een of meer spaties.
Voor deze lijn,
De SQL Server-kolom is "Mijn info". Doctrine weet niet hoe om te gaan met spaties met MSSQL. Je moet dus hooks als volgt toevoegen:
- Wanneer uw bestanden zijn gecorrigeerd, starten we met het genereren van entiteiten.
1php app/console doctrine:mapping:convert annotation ./src
Mogelijk moet u de Entity Manager specificeren die u wilt gebruiken, zoals deze: –em=”…”.
- U kunt nu de mapping verwijderen, d.w.z. de .xml-bestanden die aanwezig zijn in de Resources.
Dat is alles, je hebt nu geldige entiteiten gegenereerd door Doctrine. Deze oplossing is een beetje … "brian fuck" is geldig zolang het team dat verantwoordelijk is voor de ontwikkeling van Doctrine geen haalbare oplossing heeft geïntegreerd waarmee het TimeStamp-type standaard in PHP kan worden ondersteund.
Veel succes en tot snel!