TYPO3 v9:如何查询其他外部数据库(MSSQL)

问题描述 投票:0回答:2

我试图在我的一个存储库中查询其他外部数据库连接。在LocalConfiguration.php我定义了两个连接(DefaultExternal)。

[...]
'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'
typo3 extbase typo3-9.x
2个回答
0
投票

查看$GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping'],您可以在其中明确定义哪些表位于哪个数据库中。有关更多详细信息,请参阅此内容https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Database/Configuration/Index.html

另一个选项实际上是使用请求按名称连接,并从中创建一个查询构建器。

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

我个人会选择后者,因为它在实际的调用者代码中更明确地使用了什么。


0
投票

要使用外部数据库,您必须:

  • 在LocalConfiguration.php中配置与外部数据库和表映射的映射
  • 在myExt / Configuration / TCA / MyExternalTableName.php中为外部表定义TCA
  • 配置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
                        ...
                    }
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.