Doctrine TimeStamp Error: Importer SQL Server 2008-tabeller
Webbyrå » Digitale nyheter » Doctrine TimeStamp Error: Importer SQL Server 2008-tabeller

Doctrine TimeStamp Error: Importer SQL Server 2008-tabeller

Hvordan importere en SQL Server-tabell med et felt Tidsstempel med doktrine? Når veiledningene her og der ikke er nok, er det ofte bare én måte å oppnå målene dine på... Gjør hendene skitne! I dag foreslår jeg en løsning som jeg håper raskt vil bli integrert av fellesskapet som er ansvarlig for utviklingen av Doctrine, som gjør det mulig å lage Symfony2-enheter fra en SQL Server-database som inneholder et typefelt Tidsstempel.

Hva er tidsstempeltypen?

Det virker nødvendig for meg å spesifisere litt informasjon om tidsstempeltypen. Jeg er ingen MySQL-ekspert, men fra informasjon jeg har kommet over ser MySQL-tidsstempelet ut som en dato, noe som gjør det lettere å konvertere. Imidlertid er den samme typen for SQL Server litt mer subtil i sin forståelse. Dokumentasjonen er tilgjengelig på Microsoft Technet.

En datatype som viser automatisk genererte binære tall med ett tegn i en database.
Interessant... Og hvordan forteller jeg Doctrine at den ikke skal omvende meg? Jeg foreslår en løsning for å avlede problemet...

Finn en "tilpasset" løsning

Jeg kan allerede se meldingene som forteller meg at det allerede finnes en ferdig metode som fungerer. JA! Dessuten er det denne Symfony2-oppgaven som kan kalles på denne måten:

php app/konsoll doktrine:mapping:import
Denne oppgaven fungerer fint, men som jeg leser her, fungerer Doctrine for omtrent 70-80 % av mulige tilordninger på en database. I mitt tilfelle ønsket jeg å eksportere kartleggingen av en SQL Server (2008)-tabell, som inneholdt et kjent TimeStamp-felt. Og i de resterende 20 % av kartleggingene er det nettopp denne typen felt.

Jeg kjører kommandoen og prøver å importere kartet.

1
php app/konsoll doktrine:mapping:import —force NamespaceNameBundle xml

I mitt tilfelle måtte jeg bruke to tilleggsalternativer, nemlig:

  1. –em="..." å spesifisereEnhetsleder ansvarlig for min SQL Server-database;
  2. --filter=”tabell”. Jeg ønsket å bruke dette alternativet som fungerte med MariaDB, men så ut til å bli ignorert når det ble brukt med MSSQL. Dette lar deg spesifisere en tabell som skal eksporteres. I mitt tilfelle hadde jeg kopiert min BDD, jeg hadde slettet tabellene som ikke interesserte meg og opprettet en ny profil forEnhetsleder.
    Og her er unntaket:
1
2
[DoktrineDBALDBALunntak]
Ukjent database typen tidsstempel forespurt, DoctrineDBALPlatformsSQLServer2008Platform støtter kanskje ikke det.

Fra nå av er vi nødt til å rigge terningene.
Tidsstempeltypen støttes ikke - og jeg innrømmer at jeg ikke vet helt hvilken type PHP-felt den skal knyttes til - vi vil midlertidig fortelle Doctrine at denne typen må konverteres dato tid.

  • Gå til mappen angitt av trestrukturen, vendordoctrinedbalibDoctrineDBALPlatforms.
  • I denne mappen er klassene som støtter de fleste eksisterende DBMS.
  • I mitt tilfelle jobbet jeg med SQL Server 2008 R2, så jeg redigerer filen SQLServer2008Platform.php, men rediger gjerne en annen fil hvis den samsvarer med konfigurasjonen din.
  • Vi vil redigere metoden initialisere DoctrineTypeMappings. I variabel doctrineTypeMapping presenterer informasjonen for å konvertere typene. Legg til linjen:
    $this->doctrineTypeMapping['timestamp'] = 'datotid';
  • Start kartimport på nytt. Kartleggingen av alle feltene er importert.
  • Du må huske å fjerne linjen du la til filen. Hvis du er usikker, fjern alle leverandører og installer dem på nytt.
  • Gå nå suksessivt til filene som er generert. Banen til hver er angitt, og følg deretter indikasjonene nedenfor.
    • Du har nå tilsvarende tabeller i XML.
    • Slett linjene som tilsvarer et tidsstempeltypefelt. På denne måten vil Doctrine ignorere disse feltene.
    • En liten forholdsregel med SQL Server er å legge til hakeparenteser rundt hver verdi inneholdt av "kolonne" med ett eller flere mellomrom.
      For denne linjen,

      SQL Server-kolonnen er "Min info". Doktrine vet ikke hvordan man håndterer mellomrom med MSSQL. Så du må legge til kroker som dette:
  • Når filene dine er korrigert, starter vi enhetsgenerering.
    1
    php app/konsoll doctrine:mapping:convert annotation ./src

Du må kanskje spesifisere enhetsadministratoren som skal brukes, slik: –em="...".

  • Du kan nå slette tilordningen, det vil si .xml-filene som finnes i ressursene.
    Det er det, du har nå gyldige enheter generert av Doktrine. Denne løsningen litt ... "brian fuck" er gyldig så lenge teamet som er ansvarlig for utviklingen av Doctrine ikke har integrert en levedyktig løsning som ville tillate TimeStamp-typen å bli støttet innebygd i PHP.

Lykke til og se deg snart!

★ ★ ★ ★ ★