Doctrine TimeStamp Error: Import tabulek SQL Server 2008
Jak importovat tabulku SQL Server s polem Timestamp s Doktrínou? Když tu a tam tutoriály nestačí, často existuje jen jeden způsob, jak dosáhnout svých cílů... Ušpiněte si ruce! Dnes navrhuji řešení, které, jak doufám, bude rychle integrováno komunitou odpovědnou za vývoj Doctrine, která umožňuje vytvářet entity Symfony2 z databáze SQL Server, které obsahují pole typu Timestamp.
Jaký je typ časového razítka?
Zdá se mi nutné upřesnit několik drobných informací o typu Timestamp. Nejsem odborník na MySQL, ale z informací, na které jsem narazil, časové razítko MySQL vypadá jako datum, což usnadňuje převod. Stejný typ pro SQL Server je však ve svém chápání trochu jemnější. Dokumentace je k dispozici na webu Microsoft Technet.
Datový typ, který zpřístupňuje automaticky generovaná jednoznaková binární čísla v databázi.
Zajímavé... A jak řeknu Doctrine, aby mě nekonvertovala? Navrhuji řešení, jak problém odvrátit...
Najděte řešení „na míru“.
Už vidím, jak přicházejí zprávy, které mi říkají, že již existuje hotová metoda, která funguje. ANO! Navíc je to úloha Symfony2, kterou lze nazvat tímto způsobem:
php app/console doctrine:mapping:import
Tato úloha funguje dobře, ale jak jsem se zde dočetl, Doctrine funguje pro asi 70-80% možných mapování v databázi. V mém případě jsem chtěl exportovat mapování tabulky SQL Server (2008), která obsahovala slavné pole TimeStamp. A ve zbývajících 20 % mapování jsou přesně tyto typy polí.
Spustím příkaz a pokusím se importovat mappaqe.
|
|
V mém případě jsem musel použít dvě další možnosti, a to:
- –em=”…” specifikovatSprávce entity mám na starosti moji databázi SQL Server;
- --filter=”tabulka”. Chtěl jsem použít tuto možnost, která fungovala s MariaDB, ale zdálo se, že je při použití s MSSQL ignorována. To vám umožní určit tabulku k exportu. V mém případě jsem zkopíroval svůj BDD, smazal jsem tabulky, které mě nezajímaly, a vytvořil jsem nový profilSprávce entity.
A zde je vznesená výjimka:
|
|
Od nynějška budeme muset vybavit kostky.
Typ Timestamp není podporován – a přiznám se, že vlastně nevím, s jakým typem PHP polí jej spojit – dočasně řekneme Doctrine, že tento typ je nutné převést datetime.
- Přejděte do složky označené stromovou strukturou, vendordoctrinedbalibDoctrineDBALPplatformy.
- V této složce jsou třídy, které podporují většinu existujících DBMS.
- V mém případě jsem pracoval na SQL Server 2008 R2, takže jsem soubor upravil SQLServer2008Platform.php, ale klidně upravte jiný soubor, pokud odpovídá vaší konfiguraci.
- Metodu upravíme initializeDoctrineTypeMappings. V proměnné doctrineTypeMapping jsou přítomny informace pro převod typů. Přidejte řádek:
$this->doctrineTypeMapping['timestamp'] = 'datetime'; - Restartujte import mapování. Mapování všech polí bylo importováno.
- Nezapomeňte odstranit řádek, který jste přidali do souboru. Pokud si nejste jisti, odeberte všechny dodavatele a znovu je nainstalujte.
- Nyní přejděte postupně k souborům, které byly vygenerovány. Cesta každého z nich je označena a postupujte podle pokynů níže.
- Nyní máte ekvivalent vašich tabulek v XML.
- Odstraňte řádky, které odpovídají poli typu TimeStamp. Tímto způsobem bude Doctrine tato pole ignorovat.
- Malé opatření s SQL Server je přidat závorky kolem každé hodnoty obsažené ve "sloupci" s jednou nebo více mezerami.
Pro tuto linku,
Sloupec SQL Server je "Moje informace". Doctrine neví, jak zacházet s prostory pomocí MSSQL. Takže musíte přidat háčky takto:
- Jakmile budou vaše soubory opraveny, spustíme generování entit.
1php app/console doctrine:mapping:convert anotace ./src
Možná budete muset určit Správce entit, který se má použít, takto: –em=”…”.
- Nyní můžete smazat mapování, tj. soubory .xml obsažené v Resources.
To je vše, nyní máte platné entity generované Doctrine. Toto řešení, trochu… „brian kurva“, platí, dokud tým odpovědný za vývoj Doctrine neintegruje životaschopné řešení, které by umožňovalo nativní podporu typu TimeStamp v rámci PHP.
Hodně štěstí a brzy na viděnou!