Doctrine TimeStamp Error: Importera SQL Server 2008-tabeller
Hur man importerar en SQL Server-tabell med ett fält Tidsstämpel med doktrin? När tutorials här och där inte räcker till finns det ofta bara ett sätt att nå dina mål... Smutsa ner händerna! Idag föreslår jag en lösning, som jag hoppas snabbt kommer att integreras av gemenskapen som ansvarar för utvecklingen av Doctrine, som gör det möjligt att skapa Symfony2-enheter från en SQL Server-databas som innehåller ett typfält Tidsstämpel.
Vad är tidsstämpeltypen?
Det förefaller mig nödvändigt att specificera lite information om tidsstämpeltypen. Jag är ingen MySQL-expert, men utifrån information jag har kommit över ser MySQL-tidsstämpeln ut som ett datum, vilket gör det lättare att konvertera. Men samma typ för SQL Server är lite mer subtil i sin förståelse. Dokumentationen finns tillgänglig på Microsoft Technet.
En datatyp som exponerar automatiskt genererade binära tal med enstaka tecken i en databas.
Intressant... Och hur säger jag till Läran att inte omvända mig? Jag föreslår en lösning för att avleda problemet...
Hitta en "anpassad" lösning
Jag kan redan se meddelandena komma som säger att det redan finns en färdig metod som fungerar. OUI! Dessutom är det denna Symfony2-uppgift som kan kallas på detta sätt:
php app/konsol doktrin:mapping:import
Den här uppgiften fungerar bra, men som jag läser här fungerar Doctrine för cirka 70-80% av möjliga mappningar på en databas. I mitt fall ville jag exportera mappningen av en SQL Server (2008)-tabell, som innehöll ett berömt TimeStamp-fält. Och i de återstående 20% av mappningarna finns det just dessa typer av fält.
Jag kör kommandot och försöker importera kartan.
|
|
I mitt fall var jag tvungen att använda ytterligare två alternativ, nämligen:
- –em="..." att specificeraEnhetschef ansvarig för min SQL Server-databas;
- --filter=”tabell”. Jag ville använda det här alternativet som fungerade med MariaDB men verkade ignoreras när det användes med MSSQL. Detta låter dig ange en tabell som ska exporteras. I mitt fall hade jag kopierat min BDD, jag hade tagit bort tabellerna som inte intresserade mig och skapat en ny profil förEnhetschef.
Och här är undantaget:
|
|
Från och med nu kommer vi att behöva rigga tärningarna.
Tidstämpeltypen stöds inte - och jag erkänner att jag inte riktigt vet vilken typ av PHP-fält den ska associeras med - vi kommer tillfälligt tala om för Doctrine att denna typ måste konverteras datum Tid.
- Gå till mappen som anges av trädstrukturen, vendordoctrinedbalibDoctrineDBALPlatforms.
- I den här mappen finns klasserna för att stödja majoriteten av befintliga DBMS.
- I mitt fall arbetade jag på SQL Server 2008 R2, så jag redigerade filen SQLServer2008Platform.php, men redigera gärna en annan fil om den matchar din konfiguration.
- Vi kommer att redigera metoden initiera DoctrineTypeMappings. I variabel doctrineTypeMapping presenterar informationen för att konvertera typerna. Lägg till raden:
$this->doctrineTypeMapping['timestamp'] = 'datumtid'; - Starta om kartimporten. Kartläggningen av alla fält har importerats.
- Du måste komma ihåg att ta bort raden du lade till i filen. Om du är osäker, ta bort alla leverantörer och installera om dem.
- Gå nu successivt till filerna som har genererats. Vägen för varje indikeras, och följ i sin tur indikationerna nedan.
- Du har nu motsvarigheten till dina tabeller i XML.
- Ta bort raderna som motsvarar ett tidsstämpeltypfält. På så sätt kommer Doctrine att ignorera dessa fält.
- En liten försiktighetsåtgärd med SQL Server är att lägga till hakparenteser runt varje värde som finns i "kolumn" med ett eller flera mellanslag.
För denna linje,
SQL Server-kolumnen är "Min information". Doctrine vet inte hur man hanterar utrymmen med MSSQL. Så du måste lägga till krokar så här:
- När dina filer har korrigerats startar vi entitetsgenerering.
1php app/console doctrine:mapping:convert annotation ./src
Du kan behöva ange vilken enhetshanterare som ska användas, så här: –em="...".
- Du kan nu ta bort mappningen, det vill säga .xml-filerna som finns i resurserna.
Det är det, du har nu giltiga entiteter genererade av Doctrine. Den här lösningen lite ... "brian fuck" är giltig så länge som teamet som ansvarar för utvecklingen av Doctrine inte har integrerat en hållbar lösning som skulle tillåta TimeStamp-typen att stödjas inbyggt i PHP.
Lycka till och vi ses snart!