2017-10-30 5 views
1

mySQL 가져 오기를 사용하여 실패한 쿼리 줄에서 오류 유형을 가져 오는 방법이 정말 혼란 스럽습니다. 실제 문서가 없으므로 혼란 스럽습니다. 현재golang에서 mySQL 오류 유형을 얻는 방법은 무엇입니까?

내가 가지고 수행 할 에러 코드를 얻을 수있는 피드백은

result, err := db.Exec("INSERT INTO users (username,password,email) VALUES (?,?,?)", username, hashedPassword, email) 
if err != nil { 
    // handle different types of errors here 
    return 
} 
내가 잘못을하지만 단지 문자열, 무엇이 잘못되었는지 알 수있는 문자열 엿의 아이디어를 좋아하지 않는를 인쇄 할 수

없다

switch 또는 그 라인을 따라 무엇인가? 어떻게 할 수 있니?

답변

2

실제로 오류 문자열의 내용을 확인하는 것은 좋지 않습니다. 문자열 값은 드라이버 버전에 따라 다를 수 있습니다. 오류 번호를 비교하여 특정 오류가 무엇인지 식별하는 것이 훨씬 더 강력하고 견고합니다.

mysql 드라이버에 대한 오류 코드가 있으며 package은 주 드라이버 패키지와 별도로 유지 관리됩니다. 그러나이를 수행하는 메커니즘은 데이터베이스/SQL 자체의 일부가 아니기 때문에 드라이버마다 다릅니다.

if driverErr, ok := err.(*mysql.MySQLError); ok { 
    if driverErr.Number == mysqlerr.ER_ACCESS_DENIED_ERROR { 
     // Handle the permission-denied error 
    } 
} 

variables이 오류가 있습니다 : 해당 패키지를 사용하면 오류 MySQLError의 유형을 확인할 수 있습니다. 패키지에서 일반적으로

Ref

+1

첫 번째 라인 세드릭 내가 같은 구문을 본 적이 없다 .. 그것은'mysql.MySQLError'에'error'에서 캐스팅 설명 할 수 있습니까? 아니면 그 함수 호출 .. 조금 혼란이다. – Sir

+0

오류 유형 캐스팅입니다. 오류를 가져 와서 외부 패키지의 번호와 비교하는 방법의 예일뿐입니다. –

1

패키지 작성자가 같은 오류를 분리 할 그들 각각에 대한 변수를 만들 경우 변수를 볼 수 있습니다 : https://golang.org/pkg/database/sql/#pkg-variables

당신이 오류를 볼 수 있고 오류를 전환 할 수 있습니다 그 대가로 각 오류 변수를 반환합니다.

예 :

result, err := db.Exec("INSERT INTO users (username,password,email) VALUES (?,?,?)", username, hashedPassword, email) 
if err == sql.ErrNoRows { 
    // handle error 
    return 
} 
if err == sql.ErrTxDone { 
    // handle error 
    return 
} 
+0

더 나은 옵션은 연속적인 If 문 대신 오류가 발생하는 스위치입니다. https://play.golang.org/p/-d_skg2tK- – Kaedys