Jährliche Archiv: 2022

Mehrere Datenbanken unter Symfony

In einem Projekt bestand die Notwendigkeit, die applikationsspezifische Datenbank (MariaDB) und eine externen Datenbank (MS-SQL) gleichzeitig zu verwenden. An der Datenbankstruktur war nichts zu drehen, da die MS-SQL Datenbank in anderen Projekten ebenfalls im Produktivbetrieb verwendet wurde. Somit bestand das Problem, zwei Datenbankverbindungen parallel offen zu halten und je nach Entity-Klasse die richtige Datenbank zu verwenden.

Wie man sich unter Linux mit einer MS-SQL Datenbank verbindet, habe ich bereits im Artikel MS-SQL mit Symfony unter Linux im Detail beschrieben. In diesem Artikel geht es vornehmlich um den gleichzeitigen Betrieb zweier Datenbank und die automatische Auswahl der korrekten Datenbankverbindung.

Zwei Datenbanken parallel betreiben

Hierfür habe ich zur einfacheren Übersicht in den Verzeichnissen src/Entity und src/Repository ein Unterverzeichnis MsSql angelegt, in welche die Klassen der externen Datenbank gelegt werden. Dieser Schritt erhöht lediglich die Übersicht für menschliche Betrachter; Symfony/Doctrine ist das egal.

Somit ergeben sich die Verzeichnisse

Verzeichnis Verwendung
src/Entity Entity-Klassen der MariaDB-Datenbank
src/Entity/MsSql Entity-Klassen der MS-SQL-Datenbank
src/Repository Repository-Klassen der MariaDB-Datenbank
src/Repository/MsSql Repository-Klassen der MS-SQL-Datenbank

Zudem habe ich in der Datei doctrine.yaml zwei Verbindungen und zwei Entity-Manager definiert:

doctrine:
    dbal:
        default_connection:       default
        connections:
            default:
                driver: pdo_mysql
                dbname:           "%env(resolve:DATABASE_DB)%"
                user:             "%env(resolve:DATABASE_USER)%"
                password:         "%env(resolve:DATABASE_PASS)%"
                host:             "%env(resolve:DATABASE_HOST)%"
                port: 3306
                schema_filter: ~^(?!tt[a-z]{4}[0-9]{6})~  # Ignore Mssql tables
            mssql:
                # IMPORTANT: this configuration requires FreeTDS installed!
Weiter lesen

MS-SQL mit Symfony unter Linux nutzen

In manchen Fällen möchte man von seiner Symfony-Applikation, die auf einem Linux-Server läuft, auf einen Microsoft SQL-Server zugreifen. In meinem konkreten Anwendungsfall lief die eigentliche Symfony-Applikation auf einem aktuellen Debian mit Doctrine auf MariaDB und sollte aus einem anderen System zusätzliche Informationen holen. Dieses System besaß weder eine nutzbare API noch einfach auswertbare Webseiten/JSON-Antworten sodass nur der unschöne direkte Weg über die Datenbank ging.

Als Entwickler ist man meist naiv…

…denn man geht davon aus, dass ein so weit verbreiteter Server auch eine vernünftige Unterstützung hat. Grade jetzt, wo Microsoft in Windows 10/11 ein Linux-Subsystem einsetzt und sich Open Source ganz groß auf die Fahne schreibt. Erste Recherchen zeigten, dass Microsoft zu Zeiten von PHP 5.5 mal einen Datenbanktreiber erstellt hatte. Doctrine kann diesen auch mit dem Datenbanktypen mssql (alias pdo_sqlsrv) verwenden.

Sucht man nun den pdo_sqlsrv, landet man unter Microsoft SQL Server Functions (PDO_SQLSRV) auf php.net auf der Installstionsseite, die einen direkt ersteinmal aufklärt

The PDO_SQLSRV extension is only compatible with PHP running on Windows.

Leider wurder der Treiber nach PHP5.5 (Juni 2013) nur noch unter Windows weiterentwickelt. Darunter wird jedoch auf eine Alternative verwiesen. Den Microsoft ODBC-Treiber für Linux….zuletzt aktualisiert 2012. Man kann sich schon denken, wohin das führt, ein Blick in die README bestätigt dies aber:

This driver is only supported on 64-bit Red Hat Enterprise Linux 5 or 64-bit Red Hat Enterprise Linux 6.

Weiter lesen