Symfony/Doctrine functional tests using sqlite leads to SQLSTATE[HY000]: General error: 1 near "(": syntax error
Symfony/Doctrine functional tests using sqlite leads to SQLSTATE[HY000]: General error: 1 near "(": syntax error
我有一个使用 Doctrine 和 liip_test_fixtures_bundle 的 Symfony 应用程序。
- PHP版本:7.4.25
- Symfony 运行时版本:5.3.11
- 学说 DBAL:3.2.0
我将 Doctrine 设置为使用 sqlite 连接进行测试。 运行 测试时出现以下错误:
Doctrine\DBAL\Exception\SyntaxErrorException: An exception occurred while executing a query: SQLSTATE[HY000]: General error: 1 near "(": syntax error
我按照错误到 Doctrine\DBAL\Schema\SqliteSchemaManager::_getPortableTableIndexesList
执行了以下查询“SELECT * FROM PRAGMA_TABLE_INFO (?)”。
以下最小示例重现了该问题。请注意,它仅使用 PDO。
<?php
// setup
$pdo = new PDO( 'sqlite:'.__DIR__.'/test.db');
$pdo->exec(<<<SQL
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`content` varchar(1000) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
SQL);
// this line causes the error
$stmt = $pdo->prepare('SELECT * FROM PRAGMA_TABLE_INFO (?)');
if( !$stmt instanceof PDOStatement )
{
echo "Error occured\n";
echo "\n";
echo "Error Code: ".$pdo->errorCode()."\n";
$info = $pdo->errorInfo();
foreach( $info as $k => $v )
{
echo " $k => $v\n";
}
exit(128);
}
echo "No syntax Error detected \n";
/// outputs
Error occured
Error Code: HY000
0 => HY000
1 => 1
2 => near "(": syntax error
有什么方法可以配置 Doctrine 不对 Sqlite 数据库使用准备好的语句吗?
通过将 doctrine/dbal 限制为版本 3.1.5 暂时解决了该问题。
错误 - 我相信 - 是由这个提交引起的:https://github.com/doctrine/dbal/commit/55259d55b3b80ac43c7ff9b592bf5f8c30a4af2e
当我从 PostgreSQL 切换到 SQLite 进行集成测试时,我遇到了类似的问题。在一天结束时,我只需要正确地转义订单栏。 XML 映射中的片段:
<field name="order" type="integer" column="`order`"/>
正如我所说,它在没有反引号的情况下适用于 PostgreSQL。
我有一个使用 Doctrine 和 liip_test_fixtures_bundle 的 Symfony 应用程序。
- PHP版本:7.4.25
- Symfony 运行时版本:5.3.11
- 学说 DBAL:3.2.0
我将 Doctrine 设置为使用 sqlite 连接进行测试。 运行 测试时出现以下错误:
Doctrine\DBAL\Exception\SyntaxErrorException: An exception occurred while executing a query: SQLSTATE[HY000]: General error: 1 near "(": syntax error
我按照错误到 Doctrine\DBAL\Schema\SqliteSchemaManager::_getPortableTableIndexesList
执行了以下查询“SELECT * FROM PRAGMA_TABLE_INFO (?)”。
以下最小示例重现了该问题。请注意,它仅使用 PDO。
<?php
// setup
$pdo = new PDO( 'sqlite:'.__DIR__.'/test.db');
$pdo->exec(<<<SQL
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`content` varchar(1000) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
SQL);
// this line causes the error
$stmt = $pdo->prepare('SELECT * FROM PRAGMA_TABLE_INFO (?)');
if( !$stmt instanceof PDOStatement )
{
echo "Error occured\n";
echo "\n";
echo "Error Code: ".$pdo->errorCode()."\n";
$info = $pdo->errorInfo();
foreach( $info as $k => $v )
{
echo " $k => $v\n";
}
exit(128);
}
echo "No syntax Error detected \n";
/// outputs
Error occured
Error Code: HY000
0 => HY000
1 => 1
2 => near "(": syntax error
有什么方法可以配置 Doctrine 不对 Sqlite 数据库使用准备好的语句吗?
通过将 doctrine/dbal 限制为版本 3.1.5 暂时解决了该问题。
错误 - 我相信 - 是由这个提交引起的:https://github.com/doctrine/dbal/commit/55259d55b3b80ac43c7ff9b592bf5f8c30a4af2e
当我从 PostgreSQL 切换到 SQLite 进行集成测试时,我遇到了类似的问题。在一天结束时,我只需要正确地转义订单栏。 XML 映射中的片段:
<field name="order" type="integer" column="`order`"/>
正如我所说,它在没有反引号的情况下适用于 PostgreSQL。