Doctrine TimeStamp Error: Import SQL Server 2008 tablica
Web agencija » Digitalne vijesti » Doctrine TimeStamp Error: Import SQL Server 2008 tablica

Doctrine TimeStamp Error: Import SQL Server 2008 tablica

Kako uvesti tablicu SQL Servera s poljem Timestamp s doktrinom? Kad tutorijali tu i tamo nisu dovoljni, često postoji samo jedan način da postignete svoje ciljeve... Zaprljaj ruke! Danas predlažem rješenje, za koje se nadam da će ga Zajednica zadužena za razvoj Doctrine brzo integrirati, a koje omogućuje stvaranje Symfony2 entiteta iz baze podataka SQL Servera koji sadrže polje tipa Timestamp.

Što je vrsta vremenske oznake?

Čini mi se potrebnim navesti neke male informacije o vrsti Timestamp. Nisam stručnjak za MySQL, ali prema informacijama na koje sam naišao, MySQL vremenska oznaka izgleda kao datum, što olakšava pretvaranje. Međutim, isti tip za SQL Server je malo suptilniji u svom razumijevanju. Dokumentacija je dostupna na Microsoft Technetu.

Tip podataka koji izlaže automatski generirane binarne brojeve od jednog znaka u bazi podataka.
Zanimljivo… A kako da kažem Doktrini da me ne preobrati? Predlažem rješenje za preusmjeravanje problema...

Pronađite "prilagođeno" rješenje

Već vidim poruke koje mi govore da već postoji gotova metoda koja djeluje. DA ! Štoviše, upravo se ovaj Symfony2 zadatak može pozvati na ovaj način:

php aplikacija/konzola doktrina:mapiranje:uvoz
Ovaj zadatak radi dobro, ali kako sam ovdje pročitao, Doctrine radi za oko 70-80% mogućih mapiranja u bazi podataka. U mom slučaju, želio sam izvesti mapiranje tablice SQL Servera (2008), koja je sadržavala poznato polje TimeStamp. A u preostalih 20% preslikavanja nalaze se upravo ovakva polja.

Pokrenut ću naredbu i pokušati uvesti mappaqe.

1
php aplikacija/konzola doctrine:mapping:import —force NamespaceNameBundle xml

U mom slučaju, morao sam koristiti dvije dodatne opcije, naime:

  1. –em=”…” za navođenjeUpravitelj entiteta zadužen za moju bazu podataka SQL Servera;
  2. --filter=”tablica”. Htio sam upotrijebiti ovu opciju koja je radila s MariaDB-om, ali se činilo da je zanemarena kada se koristi s MSSQL-om. To vam omogućuje da odredite tablicu za izvoz. U mom slučaju, kopirao sam svoj BDD, izbrisao sam tablice koje me nisu zanimale i napravio novi profilUpravitelj entiteta.
    A ovdje je istaknuta iznimka:
1
2
[DoctrineDBALDBALException]
Nepoznata baza podataka vrsta zatražena vremenska oznaka, DoctrineDBALPlatformsSQLServer2008Platforma je možda neće podržavati.

Od sada ćemo morati slagati kockice.
Tip Timestamp nije podržan - i priznajem da zapravo ne znam s kojom vrstom PHP polja da ga povežem - privremeno ćemo reći Doctrineu da se ovaj tip mora pretvoriti Datum vrijeme.

  • Idite u mapu naznačenu strukturom stabla, vendordoctrinedbalibDoctrineDBALPlatforms.
  • U ovoj mapi nalaze se klase za podršku većini postojećih DBMS-a.
  • U mom slučaju radio sam na SQL Serveru 2008 R2, pa sam uredio datoteku SQLServer2008Platform.php, ali slobodno uredite drugu datoteku ako odgovara vašoj konfiguraciji.
  • Uredit ćemo metodu inicijaliziratiDoctrineTypeMappings. U varijabli doktrinaTypeMapping su prisutne informacije za pretvaranje tipova. Dodajte redak:
    $this->doctrineTypeMapping['timestamp'] = 'datumvrijeme';
  • Ponovno pokrenite uvoz mapiranja. Mapiranje svih polja je uvezeno.
  • Ne zaboravite ukloniti redak koji ste dodali u datoteku. Ako niste sigurni, uklonite sve dobavljače i ponovno ih instalirajte.
  • Sada idite sukcesivno na datoteke koje su generirane. Staza svakog od njih je naznačena, a zauzvrat slijedite indikacije u nastavku.
    • Sada imate ekvivalent svojih tablica u XML-u.
    • Izbrišite retke koji odgovaraju polju tipa TimeStamp. Na ovaj način će Doctrine zanemariti ova polja.
    • Mala mjera opreza kod SQL Servera je dodavanje zagrada oko svake vrijednosti koju sadrži "stupac" koji ima jedan ili više razmaka.
      Za ovu liniju,

      Stupac SQL Servera je "Moje informacije". Doctrine ne zna rukovati razmacima s MSSQL-om. Dakle, trebate dodati kuke poput ove:
  • Kada su vaše datoteke ispravljene, pokrećemo generiranje entiteta.
    1
    php aplikacija/konzola doctrine:mapping:convert annotation ./src

Možda ćete morati navesti Upravitelja entiteta koji ćete koristiti, ovako: –em=”…”.

  • Sada možete izbrisati mapiranje, tj. .xml datoteke prisutne u Resursima.
    To je to, sada imate važeće entitete koje je generirala Doctrine. Ovo rješenje malo... "brian fuck" vrijedi sve dok tim odgovoran za razvoj Doctrine nije integrirao održivo rješenje koje bi omogućilo da tip TimeStamp bude izvorno podržan unutar PHP-a.

Sretno i vidimo se uskoro!

★ ★ ★ ★ ★