2017-04-26 7 views
0

ODBC를 통해 백엔드 FileMaker 기반 데이터베이스에 Go REST API를 연결하려고합니다.ODBC in Go/공백 레코드

Windows에 FileMaker ODBC 드라이버를 성공적으로 설치 했으므로 DSN이 작동합니다.

이동에 DB에 연결하려면 mgodbc 패키지를 사용하고 있습니다.

그러나 연결이 작동하는 동안 (런타임 오류 없음) 쿼리를 실행할 때 공백/null 레코드 만 반환됩니다. 다음과 같이

func NewDB(dataSourceName string) (*DB, error) { 

    db, err := sql.Open("mgodbc", dataSourceName) 
    if err != nil { 
     return nil, err 
    } 
    if err = db.Ping(); err != nil { 
     return nil, err 
    } 

    // TEST 

    return &DB{db}, nil 
} 

이 나의 main 방법에서 호출되는 : db, err := md.NewDB("DSN=cet_registrations2;Uid=*****;Pwd=*****;") 나는 DB 연결을 만들려면 다음 코드가 있습니다. 그런 다음 쿼리 메서드 중 하나를 호출하여 모델 struct으로 읽으려고합니다. 나는 그것을 쉽게 내 쿼리를 단순화 :

func (db *DB) GetStudent(id int) (*Student, error) { 

    s := new(Student) 
    p := new(PersonalDetails) 

    log.Println(id) 

    rows, err := db.Query("SELECT FN_Gn_Pn FROM STUDENTS") 

    i := 0 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer rows.Close() 
    for rows.Next() { 
     i++ 
     err := rows.Scan(&p.FirstName) 
     log.Print(p.FirstName.String) 
     log.Printf(strconv.Itoa(i)) 
     if err != nil { 
      log.Fatal(err) 
     } 
    } 
    err = rows.Err() 
    if err != nil { 
     log.Fatal(err) 
    } 

    s.ID = 34114 
    s.Details = p 

    return s, err 
} 

와 나는 struct 다음으로 읽고있다 : I 모델로 스캔 값을 인쇄 할 때, 난 그냥 완전히 빈 행을 얻을

import (
    "database/sql" 

    u "sydney.edu.au/bric9018/cet.api/util" 
) 

type PersonalDetails struct { 

    // Unique identifier for person 
    ID int32 `json:"id,omitempty"` 

    // First name of person 
    FirstName sql.NullString `json:"firstName,omitempty"` 

    // Last name of person. 
    LastName sql.NullString `json:"lastName,omitempty"` 

    // Person nominated preferrered name. 
    PreferredName sql.NullString `json:"preferredName,omitempty"` 

    // Person's SSO username for University systems 
    Unikey sql.NullString `json:"unikey,omitempty"` 

    // Person's personal email 
    PersonalEmail sql.NullString `json:"personalEmail,omitempty"` 

    // Sydney University email 
    UniEmail sql.NullString `json:"uniEmail,omitempty"` 

    // Person's date of birth 
    Dob u.NullTime `json:"dob,omitempty"` 
} 

log.Print(p.FirstName.String)을 사용하십시오. 내 struct에 스캔하여 다시 읽은 값이없는 것 같습니다. 왜 이런거야?

P. FileMaker DB에 대해 연결된 서버 연결을 통해 SQL Server에서 쿼리를 실행하면 쿼리가 확실히 값을 반환합니다.

+0

'sql.NullString' 대신'[] byte' 타입을 가진 변수로 값을 스캔하면 어떻게 될까요? – putu

+0

'[] byte'로 변경하고 문자열 ('log.Print (p.FirstName)'없이 같은 print 문을 사용하면 배열에 값이 없으므로'[]'이 인쇄됩니다. – Ben

+0

드라이버를'mgodbc'에서 ['odbc' 드라이버] (https://github.com/alexbrainman/odbc)로 변경하면 어떻게됩니까? – putu

답변

1

Golang odbc 드라이버는 시스템의 odbc 드라이버 (odbc32.dll, unixODBC 등)의 래퍼입니다. SQL Server에서 쿼리를 실행할 때 어떤 결과가 발생하면 쿼리 오류 또는 시스템의 드라이버 문제가 발생할 확률을 없애줍니다. 문제는 golang의 운전자 (mgodbc)쪽에 있습니다. 가능한 문제 :

  1. 는 드라이버 (바이너리와 데이터베이스 테이블 등의 문자열을 저장, 예를 들어)로 인해 불일치/지원되지 않는 데이터 형식으로 쿼리 결과를 변환하지 못했습니다. 첫 번째 시도는 scan the result to []byte입니다.
  2. 드라이버가 버그로 인해 쿼리 결과를 변환하지 못했습니다. another odbc driver을 사용해보십시오.

문제의 데이터베이스를 사용할 수 없기 때문에 문제를 재현 할 수 없습니다. 문제가 무엇인지 알아 보려면 디버거를 사용하십시오. 개인적으로 나는 Visual Studio Code을 사용하고 있습니다. 디버거를 설정하려면 VS Code and delve debugger을 참조하십시오.

내 생각에 mgodbc's Next 함수 (줄 번호 781-1011)에 문제가 있습니다. odbc's 구현은 Next 함수는 here (줄 35) 사용할 수 있습니다. 함수는 column.Value 함수 (줄 116-165)를 사용하여 쿼리 결과를 변환합니다. 디버거를 사용하면 변수, 표현식을 관찰하고 이러한 드라이버가 쿼리 결과 변환을 처리하는 방법을 비교할 수 있습니다.