2014-02-28 1 views
1

나는 PDO를 통해 MSSQL 데이터베이스에 연결해야하는 환경에서 Fat Free Framework를 시험 중이다. 기능을 쿼리하는 데이터베이스를 테스트하기 위해 몇 가지 코드를 작성했습니다. 여기에 내 첫번째 시도가있다 :F3 SQL Server 데이터베이스에서 스키마를 가져 오지 못합니까?

$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(); 
}); 

이를하지만 실패합니다.

내부 서버 오류

PDOStatement : : [마이크로 소프트] [SQL 서버 네이티브 클라이언트 11.0] [SQL 결과 : 생성 된 질의는 필드 (SELECT FROM builds를이 생성 된 정확한 쿼리입니다)이 없습니다 서버] 'FROM'키워드 근처의 구문이 잘못되었습니다 :

[call stack]...[/call stack]

내가 뭔가를하고 있습니까 여기 정확히? 원시 SQL 접근 방식을 사용할 때 데이터를 잘 검색 할 수 있기 때문에 연결 문자열에 문제가 있다고 상상할 수 없습니다. 테이블과 엔티티 매핑을 가능하게하는 일종의 구성이 필요합니까?

참조 용으로 제공되는 가이드 here을 따라 가고 있습니다.

답변

0

나는 로그를 통해 비트를 파고, 다음과 같은 쿼리가 테이블 스키마 검색하기 위해 실행되는 것을 발견 : 쿼리는 table_schema 필드는 데이터베이스 이름이 포함되어 있음을 시행하려고했다

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****'; 

을! 열을 찾지 못하는 것도 당연한 일입니다. 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'). 

수정 문제. 나는 다른 DB가 데이터베이스 이름을 나타내는 필드를 어떻게 저장하는지 잘 모르므로, 보수적 인 것이 가장 좋으며 SQL 서버 데이터베이스에 대해서만이 변경이 필요하다고 생각한다.

+0

이 버그를 지적 해 주신 Asad 감사합니다. 수정본이 코드에 병합되도록 [Github] (https://github.com/bcosca/fatfree/issues)에 문제를 만들 수 있습니까? – xfra35

+0

@ xfra35 [여기] (https://github.com/bcosca/fatfree/issues/565)에서 문제점을 열었습니다. 내 개인 의견은 이것이 좋은 수정보다 더 많은 임시 방편이라는 것입니다. –

관련 문제