Doctrine TimeStamp Error: SQL Server 2008-Tabellen importieren
Webagentur » Digitale Nachrichten » Doctrine TimeStamp Error: SQL Server 2008-Tabellen importieren

Doctrine TimeStamp Error: SQL Server 2008-Tabellen importieren

So importieren Sie eine SQL Server-Tabelle mit einem Feld Timestamp mit Lehre? Wenn die Tutorials hier und da nicht ausreichen, gibt es oft nur einen Weg zum Ziel ... Machen Sie sich die Hände schmutzig! Heute schlage ich eine Lösung vor, die hoffentlich schnell von der Community integriert wird, die für die Entwicklung von Doctrine verantwortlich ist, die es ermöglicht, Symfony2-Entitäten aus einer SQL Server-Datenbank zu erstellen, die ein Typfeld enthalten Timestamp.

Was ist der Timestamp-Typ?

Es erscheint mir notwendig, einige kleine Informationen zum Timestamp-Typ anzugeben. Ich bin kein MySQL-Experte, aber nach Informationen, auf die ich gestoßen bin, sieht der MySQL-Zeitstempel wie ein Datum aus, was die Konvertierung erleichtert. Derselbe Typ für SQL Server ist jedoch etwas subtiler in seinem Verständnis. Die Dokumentation ist im Microsoft Technet verfügbar.

Ein Datentyp, der automatisch generierte Einzelzeichen-Binärzahlen in einer Datenbank verfügbar macht.
Interessant… Und wie sage ich Doctrine, dass es mich nicht konvertieren soll? Ich schlage eine Lösung vor, um das Problem abzulenken ...

Finden Sie eine „maßgeschneiderte“ Lösung

Ich sehe schon die Meldungen kommen, die mir sagen, dass es bereits eine fertige Methode gibt, die funktioniert. YES! Außerdem ist es diese Symfony2-Aufgabe, die auf diese Weise aufgerufen werden kann:

php app/console lehre:zuordnung:import
Diese Aufgabe funktioniert gut, aber wie ich hier gelesen habe, funktioniert Doctrine für etwa 70-80% der möglichen Zuordnungen in einer Datenbank. In meinem Fall wollte ich die Zuordnung einer SQL Server (2008)-Tabelle exportieren, die ein berühmtes TimeStamp-Feld enthielt. Und in den restlichen 20% der Mappings gibt es genau solche Felder.

Ich werde den Befehl ausführen und versuchen, die Mappaqe zu importieren.

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

In meinem Fall musste ich zwei zusätzliche Optionen verwenden, nämlich:

  1. –em="…" die anzugebenEntitätsmanager verantwortlich für meine SQL Server-Datenbank;
  2. --filter=”Tabelle”. Ich wollte diese Option verwenden, die mit MariaDB funktionierte, aber bei Verwendung mit MSSQL ignoriert zu werden schien. Auf diese Weise können Sie eine zu exportierende Tabelle angeben. In meinem Fall hatte ich meine BDD kopiert, ich hatte die Tabellen gelöscht, die mich nicht interessierten, und ein neues Profil erstelltEntitätsmanager.
    Und hier ist die ausgelöste Ausnahme:
1
2
[DoctrineDBALDBALException]
Unbekannte Datenbank tippe Zeitstempel angefordert, DoctrineDBALPlatformsSQLServer2008Platform unterstützt dies möglicherweise nicht.

Von jetzt an müssen wir die Würfel manipulieren.
Der Timestamp-Typ wird nicht unterstützt – und ich gebe zu, dass ich nicht wirklich weiß, mit welchem ​​Typ von PHP-Feldern ich ihn verknüpfen soll – wir werden Doctrine vorübergehend mitteilen, dass dieser Typ konvertiert werden muss datetime.

  • Gehen Sie zu dem Ordner, der durch die Baumstruktur angezeigt wird, AnbieterdoctrinedbalibDoctrineDBALPlatforms.
  • In diesem Ordner befinden sich die Klassen zur Unterstützung der meisten vorhandenen DBMS.
  • In meinem Fall habe ich an SQL Server 2008 R2 gearbeitet, also bearbeite ich die Datei SQLServer2008Platform.php, aber Sie können gerne eine andere Datei bearbeiten, wenn sie Ihrer Konfiguration entspricht.
  • Wir werden die Methode bearbeiten initializeDoctrineTypeMappings. Variabel DoktrinTypeMapping ist die Information vorhanden, um die Typen umzuwandeln. Fügen Sie die Zeile hinzu:
    $this->doctrineTypeMapping['timestamp'] = 'datetime';
  • Mapping-Import neu starten. Die Zuordnung aller Felder wurde importiert.
  • Sie müssen daran denken, die Zeile zu entfernen, die Sie der Datei hinzugefügt haben. Wenn Sie sich nicht sicher sind, entfernen Sie alle Anbieter und installieren Sie sie erneut.
  • Gehen Sie nun nacheinander zu den erzeugten Dateien. Der Pfad von jedem ist angegeben, und folgen Sie der Reihe nach den Hinweisen unten.
    • Sie haben jetzt das Äquivalent Ihrer Tabellen in XML.
    • Löschen Sie die Zeilen, die einem Feld vom Typ TimeStamp entsprechen. Auf diese Weise ignoriert Doctrine diese Felder.
    • Eine kleine Vorsichtsmaßnahme bei SQL Server besteht darin, eckige Klammern um jeden Wert hinzuzufügen, der in "Spalte" mit einem oder mehreren Leerzeichen enthalten ist.
      Für diese Zeile

      Die SQL Server-Spalte ist "Meine Infos". Doctrine weiß nicht, wie man mit Leerzeichen in MSSQL umgeht. Sie müssen also Hooks wie folgt hinzufügen:
  • Wenn Ihre Dateien korrigiert wurden, starten wir die Entitätsgenerierung.
    1
    php app/console Doktrin:Zuordnung:Anmerkung konvertieren ./src

Möglicherweise müssen Sie den zu verwendenden Entity Manager wie folgt angeben: –em="…".

  • Sie können jetzt das Mapping löschen, d. h. die in den Ressourcen vorhandenen .xml-Dateien.
    Das war's, Sie haben jetzt gültige Entitäten, die von Doctrine generiert wurden. Diese Lösung ein bisschen … „Brian Fuck“ ist gültig, solange das Team, das für die Entwicklung von Doctrine verantwortlich ist, keine praktikable Lösung integriert hat, die es ermöglichen würde, den TimeStamp-Typ nativ in PHP zu unterstützen.

Viel Glück und bis bald!

★ ★ ★ ★ ★