我正在尝试在我需要通过PDO连接到MSSQL数据库的环境中使用Fat Free Framework。我写了一些代码来测试数据库查询功能。这是我的第一次尝试:
$f3->route('GET /datasets/read', function($f3) {
$db = new DB\SQL('sqlsrv:Server=192.168.**.**;Database=test',"sa","*****");
$results = $db->exec('SELECT * FROM builds');
var_dump($results);
});
这很好用。我看到builds
表中所有记录的转储很好。到目前为止一切都很好。
我接下来尝试的是使用框架提供的ORM方法:
$f3->route('GET /datasets/read', function($f3) {
$db = new DB\SQL('sqlsrv:Server=192.168.**.**;Database=test',"sa","*****");
$builds =new DB\SQL\Mapper($db,'builds')
$builds->load();
});
然而,这失败了。生成的查询没有字段(这是生成的确切查询:SELECT FROM builds
),结果为:
内部服务器错误
PDOStatement:[Microsoft] [SQL Server Native Client 11.0] [SQL Server]关键字'FROM'附近的语法不正确:
[call stack]...[/call stack]
我在这里做错了吗?我无法想象连接字符串存在问题,因为它在使用原始SQL方法时设法检索数据就好了。是否需要某种配置来启用表到实体的映射?
我正在关注提供here的指南,以供参考。
答案 0 :(得分:0)
我稍微挖了一下日志,发现正在执行以下查询来检索表模式:
SELECT c.column_name AS field,
c.data_type AS type,
c.column_default AS defval,
c.is_nullable AS nullable,
t.constraint_type AS pkey
FROM information_schema.columns AS c
LEFT OUTER JOIN information_schema.key_column_usage AS k
ON c.table_name = k.table_name
AND c.column_name = k.column_name
AND c.table_schema = k.table_schema
LEFT OUTER JOIN information_schema.table_constraints AS t
ON k.table_name = t.table_name
AND k.constraint_name = t.constraint_name
AND k.table_schema = t.table_schema
WHERE c.table_name = 'builds'
AND c.table_schema = 'test****';
该查询试图强制table_schema
字段包含数据库名称!难怪它没有找到任何专栏。转到lib/db/sql/sql.php
并从中更改第249行:
($this->engine=='pgsql'?
'c.table_catalog':'c.table_schema').
到此:
($this->engine=='pgsql'||$this->engine== 'sqlsrv'?
'c.table_catalog':'c.table_schema').
解决了这个问题。我不知道其他数据库如何存储指示数据库名称的字段,因此我认为最好保守一点,只对SQL服务器数据库进行此更改,我确信这是需要的。