TYPO3 v9:如何查询额外的外部数据库(MSSQL)
TYPO3 v9: how to query additional external database (MSSQL)
我正在尝试在我的一个存储库中查询额外的外部数据库连接。在 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'
查看 $GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping']
,您可以在其中明确定义哪些表位于哪个数据库中。另请参阅此以了解更多详细信息 https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Database/Configuration/Index.html
另一个选项实际上是使用按名称询问连接,并从中创建一个查询构建器。
GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionByName('External')->createQueryBuilder(...)
我个人会选择后者,因为它在实际调用者代码中使用的内容更加明确。
要使用外部数据库,您必须:
- 配置与外部数据库的映射和 table 在 LocalConfiguration.php
中的映射
- 在 myExt/Configuration/TCA/MyExternalTableName 中为外部 table 定义 TCA。php
- 在ext_typoscript_setup.txt
中配置外部tables/columns映射
然后,存储库中的查询将起作用。
样本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
...
}
}
}
}
}
}
我正在尝试在我的一个存储库中查询额外的外部数据库连接。在 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'
查看 $GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping']
,您可以在其中明确定义哪些表位于哪个数据库中。另请参阅此以了解更多详细信息 https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Database/Configuration/Index.html
另一个选项实际上是使用按名称询问连接,并从中创建一个查询构建器。
GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionByName('External')->createQueryBuilder(...)
我个人会选择后者,因为它在实际调用者代码中使用的内容更加明确。
要使用外部数据库,您必须:
- 配置与外部数据库的映射和 table 在 LocalConfiguration.php 中的映射
- 在 myExt/Configuration/TCA/MyExternalTableName 中为外部 table 定义 TCA。php
- 在ext_typoscript_setup.txt 中配置外部tables/columns映射
然后,存储库中的查询将起作用。
样本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
...
}
}
}
}
}
}