Doctrine TimeStamp Hatası: SQL Server 2008 tablolarını içe aktarın
Alan içeren bir SQL Server tablosu nasıl içe aktarılır Zaman Damgası Doktrin ile mi? Buradaki ve oradaki öğreticiler yeterli olmadığında, amaçlarınıza ulaşmanın genellikle tek bir yolu vardır... Ellerini kirlet! Bugün, bir tür alanı içeren bir SQL Server veritabanından Symfony2 varlıkları oluşturmaya izin veren Doctrine'in geliştirilmesinden sorumlu Topluluk tarafından hızlı bir şekilde entegre edileceğini umduğum bir çözüm öneriyorum. Zaman Damgası.
Zaman Damgası türü nedir?
Timestamp türü hakkında bazı küçük bilgiler belirtmek bana gerekli görünüyor. MySQL uzmanı değilim, ancak edindiğim bilgilere göre MySQL Zaman Damgası bir tarih gibi görünüyor, bu da dönüştürmeyi kolaylaştırıyor. Bununla birlikte, SQL Server için aynı tür, anlayışında biraz daha inceliklidir. Dokümantasyon Microsoft Technet'te mevcuttur.
Bir veritabanında otomatik olarak oluşturulmuş tek karakterli ikili sayıları ortaya çıkaran bir veri türü.
İlginç... Peki Doctrine'e beni dönüştürmemesini nasıl söylerim? Sorunu dağıtmak için bir çözüm öneriyorum ...
"Özel" bir çözüm bulun
Halihazırda işe yarayan hazır bir yöntem olduğunu söyleyen mesajların geldiğini şimdiden görebiliyorum. EVET ! Ayrıca, şu şekilde çağrılabilen bu Symfony2 görevidir:
php uygulaması/konsol doktrini: eşleme: içe aktarma
Bu görev iyi çalışıyor, ancak burada okuduğum kadarıyla, Doctrine bir veritabanındaki olası eşlemelerin yaklaşık %70-80'i için çalışıyor. Benim durumumda, ünlü bir TimeStamp alanı içeren bir SQL Server (2008) tablosunun eşlemesini dışa aktarmak istedim. Ve eşlemelerin kalan %20'sinde tam olarak bu tür alanlar var.
Komutu çalıştıracağım ve mappaqe'yi içe aktarmayı deneyeceğim.


Benim durumumda, iki ek seçenek kullanmak zorunda kaldım, yani:
- –em=”…” belirtmek içinVarlık Yöneticisi SQL Server veritabanımdan sorumlu;
- --filter=”tablo”. MariaDB ile çalışan ancak MSSQL ile kullanıldığında göz ardı edilen bu seçeneği kullanmak istedim. Bu, dışa aktarılacak bir tablo belirlemenizi sağlar. Benim durumumda BDD'mi kopyalamıştım, ilgimi çekmeyen tabloları silmiştim ve yeni bir profil oluşturmuştum.Varlık Yöneticisi.
Ve işte ortaya çıkan istisna:


Şu andan itibaren, zar atmak zorunda kalacağız.
Zaman Damgası türü desteklenmiyor - ve bunu ne tür PHP alanlarıyla ilişkilendireceğimi gerçekten bilmediğimi kabul ediyorum - Doctrine'e geçici olarak bu türün dönüştürülmesi gerektiğini söyleyeceğiz datetime.
- Ağaç yapısı ile belirtilen klasöre gidin, vendordoctrinedbalibDoctrineDBALPlatformlar.
- Bu klasörde, mevcut DBMS'nin çoğunu destekleyen sınıflar bulunur.
- Benim durumumda SQL Server 2008 R2 üzerinde çalışıyordum, bu yüzden dosyayı düzenliyorum SQLServer2008Platform.php, ancak yapılandırmanızla eşleşiyorsa başka bir dosyayı düzenlemekten çekinmeyin.
- Yöntemi düzenleyeceğiz DoctrineTypeMappings'i başlat. değişken olarak doktrinTip Eşleme türleri dönüştürmek için bilgi mevcuttur. satırı ekleyin:
$this->doctrineTypeMapping['timestamp'] = 'datetime';
- Eşleme içe aktarmayı yeniden başlatın. Tüm alanların eşlemesi içe aktarıldı.
- Dosyaya eklediğiniz satırı kaldırmayı unutmamalısınız. Emin değilseniz, tüm satıcıları kaldırın ve yeniden yükleyin.
- Şimdi art arda oluşturulan dosyalara gidin. Her birinin yolu belirtilmiştir ve sırayla aşağıdaki göstergeleri izleyin.
- Artık XML'deki tablolarınızın eşdeğerine sahipsiniz.
- Bir TimeStamp tipi alanına karşılık gelen satırları silin. Bu şekilde, Doctrine bu alanları yok sayacaktır.
- SQL Server ile ilgili küçük bir önlem, bir veya daha fazla boşluk içeren "sütun" tarafından kapsanan her değerin etrafına köşeli parantezler eklemektir.
Bu hat için,
SQL Server sütunu "Bilgilerim"dir. Doctrine, MSSQL ile boşlukların nasıl işleneceğini bilmiyor. Bu nedenle, bunun gibi kancalar eklemeniz gerekir:
- Dosyalarınız düzeltildiğinde varlık oluşturmaya başlarız.
1php uygulaması/konsol doktrini: eşleme: ek açıklamayı dönüştür ./src
Kullanılacak Varlık Yöneticisini şu şekilde belirtmeniz gerekebilir: –em=”…”.
- Artık eşlemeyi, yani Kaynaklarda bulunan .xml dosyalarını silebilirsiniz.
İşte bu kadar, artık Doctrine tarafından oluşturulmuş geçerli varlıklara sahipsiniz. Bu çözüm, biraz... "brian fuck", Doctrine'i geliştirmekten sorumlu ekip, TimeStamp türünün PHP içinde yerel olarak desteklenmesine izin verecek geçerli bir çözüm entegre etmediği sürece geçerlidir.
İyi şanslar ve yakında görüşürüz!