Eroare Doctrine TimeStamp: importați tabele SQL Server 2008
Agenție web » Știri digitale » Eroare Doctrine TimeStamp: importați tabele SQL Server 2008

Eroare Doctrine TimeStamp: importați tabele SQL Server 2008

Cum se importă un tabel SQL Server cu un câmp Marcaj de timp cu Doctrina? Când tutorialele aici și colo nu sunt suficiente, de multe ori există o singură modalitate de a-ți atinge scopurile... Murdareste-te mainile! Astăzi vă propun o soluție, care sper să fie integrată rapid de către Comunitatea responsabilă cu dezvoltarea Doctrine, care permite crearea de entități Symfony2 dintr-o bază de date SQL Server care conțin un câmp de tip Marcaj de timp.

Care este tipul de marcaj temporal?

Mi se pare necesar să precizez câteva mici informații despre tipul Timestamp. Nu sunt un expert MySQL, dar din informațiile pe care le-am întâlnit, marcajul de timp MySQL arată ca o dată, ceea ce face mai ușor de conversie. Cu toate acestea, același tip pentru SQL Server este puțin mai subtil în înțelegerea sa. Documentația este disponibilă pe Microsoft Technet.

Un tip de date care expune numere binare cu un singur caracter generate automat într-o bază de date.
Interesant... Și cum îi spun Doctrinei să nu mă convertească? Propun o solutie pentru a devia problema...

Găsiți o soluție „personalizată”.

Văd deja mesajele care vin spunându-mi că există deja o metodă gata făcută care funcționează. DA! Mai mult, această sarcină Symfony2 poate fi apelată în acest fel:

aplicația php/consola doctrine:mapping:import
Această sarcină funcționează bine, dar după cum am citit aici, Doctrine funcționează pentru aproximativ 70-80% din mapările posibile dintr-o bază de date. În cazul meu, am vrut să export maparea unui tabel SQL Server (2008), care conținea un câmp celebru TimeStamp. Și în restul de 20% din mapări, există tocmai aceste tipuri de câmpuri.

Voi rula comanda și voi încerca să import mappaqe.

1
php app/console doctrine:mapping:import —force NamespaceNameBundle xml

În cazul meu, a trebuit să folosesc două opțiuni suplimentare și anume:

  1. –em=”…” pentru a specificaManager de entitate responsabil de baza mea de date SQL Server;
  2. --filter=”tabel”. Am vrut să folosesc această opțiune care a funcționat cu MariaDB, dar părea să fie ignorată atunci când este folosită cu MSSQL. Acest lucru vă permite să specificați un tabel de exportat. În cazul meu, mi-am copiat BDD-ul, am șters tabelele care nu mă interesau și am creat un nou profil deManager de entitate.
    Și iată excepția ridicată:
1
2
[DoctrinăDBALDBALexcepție]
Baza de date necunoscută tip marca temporală solicitată, este posibil ca DoctrineDBALPlatformsSQLServer2008Platform să nu-l accepte.

De acum înainte, va trebui să trucăm zarurile.
Tipul Timestamp nu este acceptat - și recunosc că nu știu cu adevărat cu ce tip de câmpuri PHP să-l asociez - vom spune temporar Doctrinei că acest tip trebuie convertit datetime.

  • Accesați folderul indicat de structura arborescentă, vendordoctrinedbalibDoctrineDBALPlatforms.
  • În acest folder sunt clasele pentru a suporta majoritatea SGBD-urilor existente.
  • În cazul meu, lucram la SQL Server 2008 R2, așa că editez fișierul SQLServer2008Platform.php, dar nu ezitați să editați un alt fișier dacă se potrivește cu configurația dvs.
  • Vom edita metoda initializeDoctrineTypeMappings. În variabilă doctrineTypeMapping este prezentă informația pentru a converti tipurile. Adăugați linia:
    $this->doctrineTypeMapping['timestamp'] = 'datetime';
  • Reporniți importul cartografierii. Maparea tuturor câmpurilor a fost importată.
  • Trebuie să vă amintiți să eliminați linia adăugată în fișier. Dacă nu sunteți sigur, eliminați toți furnizorii și reinstalați-i.
  • Acum mergeți succesiv la fișierele care au fost generate. Calea fiecăruia este indicată și, la rândul său, urmează indicațiile de mai jos.
    • Acum aveți echivalentul tabelelor dvs. în XML.
    • Ștergeți liniile care corespund unui câmp de tip TimeStamp. În acest fel, Doctrina va ignora aceste domenii.
    • O mică precauție cu SQL Server este să adăugați paranteze pătrate în jurul fiecărei valori conținute de „coloană” având unul sau mai multe spații.
      Pentru aceasta linie,

      Coloana SQL Server este „Informațiile mele”. Doctrine nu știe cum să gestioneze spațiile cu MSSQL. Deci, trebuie să adăugați cârlige ca acesta:
  • Când fișierele dvs. au fost corectate, lansăm generarea de entități.
    1
    php app/console doctrine:mapping:convert adnotation ./src

Poate fi necesar să specificați managerul de entitate de utilizat, astfel: –em=”…”.

  • Acum puteți șterge maparea, adică fișierele .xml prezente în Resurse.
    Gata, acum ai entități valide generate de Doctrine. Această soluție un pic... „brian fuck” este valabilă atâta timp cât echipa responsabilă de dezvoltarea Doctrine nu a integrat o soluție viabilă care să permită suportarea nativă a tipului TimeStamp în PHP.

Succes și ne vedem curând!

★ ★ ★ ★ ★