Doktrin TimeStamp-fejl: Importer SQL Server 2008-tabeller
Sådan importeres en SQL Server-tabel med et felt Timestamp med doktrin? Når tutorials her og der ikke er nok, er der ofte kun én måde at nå dine mål... Gør dine hænder snavsede! I dag foreslår jeg en løsning, som jeg håber hurtigt vil blive integreret af Fællesskabet, der er ansvarlig for udviklingen af Doctrine, som gør det muligt at oprette Symfony2-enheder fra en SQL Server-database, som indeholder et typefelt Timestamp.
Hvad er tidsstempeltypen?
Det forekommer mig nødvendigt at specificere nogle små oplysninger om tidsstempeltypen. Jeg er ikke MySQL-ekspert, men ud fra oplysninger, jeg er stødt på, ligner MySQL-tidsstemplet en dato, hvilket gør det nemmere at konvertere. Den samme type til SQL Server er dog lidt mere subtil i sin forståelse. Dokumentationen er tilgængelig på Microsoft Technet.
En datatype, der afslører automatisk genererede enkelttegns binære tal i en database.
Interessant... Og hvordan fortæller jeg Doctrine ikke at omvende mig? Jeg foreslår en løsning for at aflede problemet...
Find en "tilpasset" løsning
Jeg kan allerede se beskederne komme, der fortæller mig, at der allerede er en færdiglavet metode, der virker. JA ! Desuden er det denne Symfony2 opgave, der kan kaldes på denne måde:
php app/konsol doktrin:mapping:import
Denne opgave fungerer fint, men som jeg læser her, virker Doctrine for omkring 70-80% af mulige kortlægninger på en database. I mit tilfælde ønskede jeg at eksportere kortlægningen af en SQL Server (2008) tabel, som indeholdt et berømt TimeStamp-felt. Og i de resterende 20 % af kortlægningerne er der netop disse typer felter.
Jeg vil køre kommandoen og forsøge at importere mappen.
|
|
I mit tilfælde var jeg nødt til at bruge to yderligere muligheder, nemlig:
- –em=”…” at specificereEnhedsleder ansvarlig for min SQL Server-database;
- --filter=”tabel”. Jeg ønskede at bruge denne mulighed, som fungerede med MariaDB, men som syntes at blive ignoreret, når den blev brugt med MSSQL. Dette giver dig mulighed for at angive en tabel, der skal eksporteres. I mit tilfælde havde jeg kopieret min BDD, jeg havde slettet de tabeller, som ikke interesserede mig og oprettet en ny profil afEnhedsleder.
Og her er undtagelsen rejst:
|
|
Fra nu af bliver vi nødt til at rigge terningerne.
Tidsstempeltypen understøttes ikke - og jeg indrømmer, at jeg ikke rigtig ved, hvilken type PHP-felter den skal knyttes til - vi vil midlertidigt fortælle Doctrine, at denne type skal konverteres dato tid.
- Gå til mappen angivet af træstrukturen, vendordoctrinedbalibDoctrineDBALPlatforms.
- I denne mappe er klasserne til at understøtte størstedelen af eksisterende DBMS.
- I mit tilfælde arbejdede jeg på SQL Server 2008 R2, så jeg redigerede filen SQLServer2008Platform.php, men du er velkommen til at redigere en anden fil, hvis den matcher din konfiguration.
- Vi vil redigere metoden initialisere DoctrineTypeMappings. I variabel doctrineTypeMapping er til stede informationen til at konvertere typerne. Tilføj linjen:
$this->doctrineTypeMapping['timestamp'] = 'datetime'; - Genstart kortlægningsimport. Kortlægningen af alle felter er blevet importeret.
- Du skal huske at fjerne den linje, du tilføjede til filen. Hvis du er usikker, skal du fjerne alle leverandører og geninstallere dem.
- Gå nu successivt til de filer, der er blevet genereret. Stien for hver er angivet, og følg derefter indikationerne nedenfor.
- Du har nu det, der svarer til dine tabeller i XML.
- Slet de linjer, der svarer til et tidsstempeltypefelt. På denne måde vil Doktrin ignorere disse felter.
- En lille forholdsregel med SQL Server er at tilføje parenteser omkring hver værdi indeholdt af "kolonne" med et eller flere mellemrum.
For denne linje,
SQL Server-kolonnen er "Mine oplysninger". Doktrin ved ikke, hvordan man håndterer mellemrum med MSSQL. Så du skal tilføje kroge som denne:
- Når dine filer er blevet rettet, starter vi enhedsgenerering.
1php app/konsol doktrin:mapping:konverter annotation ./src
Du skal muligvis angive den enhedsadministrator, der skal bruges, sådan her: –em=”…”.
- Du kan nu slette tilknytningen, dvs. .xml-filerne i ressourcerne.
Det er det, du har nu gyldige entiteter genereret af Doktrin. Denne løsning lidt ... "brian fuck" er gyldig, så længe det team, der er ansvarligt for udviklingen af Doctrine, ikke har integreret en levedygtig løsning, der ville tillade, at TimeStamp-typen understøttes indbygget i PHP.
Held og lykke og vi ses snart!