F3没有从SQL服务器数据库中提取架构?

时间:2014-02-28 03:11:06

标签: php sql-server pdo fat-free-framework

我正在尝试在我需要通过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的指南,以供参考。

1 个答案:

答案 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服务器数据库进行此更改,我确信这是需要的。