Monatliches Archiv: Oktober 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