TYPO3 v9: как запросить дополнительную внешнюю базу данных (MSSQL) - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь запросить дополнительное подключение к внешней базе данных в одном из моих репозиториев.В LocalConfiguration.php я определил два соединения (Default, External).

[...]
'DB' => [
    'Connections' => [
        // Local MySQL database
        'Default' => [
            // ...
        ],
        // External MSSQL database
        'External' => [
            'charset' => 'utf-8',
            'dbname' => 'DBNAME',
            'driver' => 'sqlsrv',
            'host' => 'someExternalIP',
            'password' => 'somePassword',
            'port' => 1433,
            'user' => 'someUser',
        ],
    ],
],
[...]

В моем репозитории я хочу запросить внешнюю базу данных (через Doctrine).

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
    ->getQueryBuilderForTable('dbo.SomeTable');
$queryBuilder->getRestrictions()->removeAll();
$queryBuilder
    ->select('*')
    ->from('dbo.SomeTable');

Должен ли я явно указать QueryBuilder, чтобы использовать это конкретное соединение?Сейчас я получаю ошибку Doctrine\DBAL\Exception\ConnectionException, так как система пытается подключиться через Default -Connection.

An exception occurred while executing 'SELECT * FROM `dbo`.`SomeTable`':
SELECT command denied to user 'myLocalUser'@'localhost' for table 'SomeTable'

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Для работы с внешней БД необходимо:

  • настроить сопоставление с внешней базой данных и сопоставление таблиц в LocalConfiguration.php
  • определить TCA для внешних таблиц в myExt /Configuration / TCA / MyExternalTableName.php
  • настроить отображение внешних таблиц / столбцов в ext_typoscript_setup.txt

, а затем запросы в репозиториях будут работать.

ПримерLocalConfiguration.php:

'DB' => [
    'Connections' => [
        'Default' => [
            'charset' => 'utf8',
            'dbname' => 'LOCAL-DB',
            'driver' => 'mysqli',
            'host' => '127.0.0.1',
            'password' => 'PWD',
            'port' => 3306,
            'user' => 'USER',
        ],
        'externalDb' => [
            'charset' => 'utf8',
            'dbname' => 'EXTERNAL-DB',
            'driver' => 'mysqli',
            'host' => 'localhost',
            'password' => 'PWD',
            'port' => 3306,
            'user' => 'USER',
        ],
    ],
    'TableMapping' => [
        'MyexternalTable1' => 'externalDb',
        'MyexternalTable2' => 'externalDb',
        ...
    ]
]

Пример сопоставления столбцов в myExt / ext_typoscript_setup.txt:

plugin.tx_myext {
    persistence {
        classes {
            Vendor\MyExt\Domain\Model\LocalModel {
                mapping {
                    tableName = ExternalTableName
                    recordType = \Vendor\MyExt\Domain\Model\LocalModel
                    columns {
                        col1.mapOnProperty = uid
                        col2.mapOnProperty = name
                        ...
                    }
                }
            }
        }
    }
}
0 голосов
/ 18 марта 2019

Проверьте $GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping'], где вы можете явно определить, какие таблицы расположены в какой базе данных. Смотрите также это для более подробной информации https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Database/Configuration/Index.html

Другой вариант на самом деле - использовать запросить соединение по имени и создать из него построитель запросов.

GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionByName('External')->createQueryBuilder(...)

Лично я бы согласился с последним, так как он более явный в используемом коде вызывающего абонента.

...