>백엔드 개발 >Golang >Go\의 Query() 메서드를 사용할 때 SET 변수로 MySQL 쿼리를 실행할 수 있습니까?

Go\의 Query() 메서드를 사용할 때 SET 변수로 MySQL 쿼리를 실행할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-24 02:37:02428검색

Can You Execute MySQL Queries with SET Variables when Using Go's Query() Method?

Go에서 SET 변수를 사용하는 MySQL 쿼리

배경:

사용자가 다음을 시도하고 있습니다. 쿼리를 실행하기 전에 사용자 변수를 설정하는 Go를 사용하여 복잡한 MySQL 쿼리를 실행합니다. 쿼리는 콘솔에서 성공적으로 실행되지만 Go를 통해 실행하면 구문 오류로 인해 실패합니다. 사용자가 Go의 Query() 메소드에서 SET 변수를 사용할 수 있는지 질문하고 있습니다.

해결 방법:

사용자의 문제는 다음과 같이 수정하여 해결되었습니다.

  1. DSN 구성:

    • 데이터베이스에 연결할 때 사용되는 DSN에 ?multiStatements=true&interpolateParams=true를 추가했습니다. 이를 통해 단일 호출에서 여러 문을 실행할 수 있고 매개변수 보간이 가능해집니다.
  2. 데이터베이스 및 테이블 변환:

    • 데이터베이스 및 관련 테이블을 utf8mb4_general_ci 데이터 정렬로 변환했습니다. 데이터 정렬 불일치와 관련된 오류가 해결되었습니다.

코드:

이러한 수정을 통해 사용자가 제공한 코드가 작동해야 합니다. 예상대로:

<code class="go">func (d *DB) SelectByUserId(uid string, srt string, pg, lim int) ([]Inventory, error) {
    query := `
    SET @user_id := ?,
        @orderBy := ?;
    SELECT
        *
    FROM
        inventory
    WHERE
        user_id = @user_id
    ORDER BY
        (CASE WHEN @orderBy = 'type,asc' THEN type END),
        (CASE WHEN @orderBy = 'type,desc' THEN type END) DESC,
        (CASE WHEN @orderBy = 'visible,asc' THEN visible END),
        (CASE WHEN @orderBy = 'visible,desc' THEN visible END) DESC,
        (CASE WHEN @orderBy = 'create_date,asc' THEN create_date END),
        (CASE WHEN @orderBy = 'create_date,desc' THEN create_date END) DESC,
        (CASE WHEN @orderBy = 'update_date,asc' THEN update_date END),
        (CASE WHEN @orderBy = 'update_date,desc' THEN update_date END) DESC
    LIMIT ?,?;
    `

    rows, err := d.Query(
        query,
        uid,
        srt,
        pg*lim,
        lim,
    )

    if err != nil {
        return nil, err
    }
    defer rows.Close()

    result := make([]Inventory, 0)
    for rows.Next() {
        var inv Inventory
        if err := rows.Scan(
            &inv.Id,
            &inv.UserId,
            &inv.Type,
            &inv.Name,
            &inv.Description,
            &inv.Visible,
            &inv.CreateDate,
            &inv.UpdateDate); err != nil {
            return result, err
        }
        result = append(result, inv)
    }
    if err = rows.Err(); err != nil {
        return result, err
    }

    return result, nil
}</code>

DSN 구성을 수정하고 데이터베이스와 테이블을 적절한 데이터 정렬로 변환하면 사용자는 구문 오류를 피하면서 문제의 쿼리를 성공적으로 실행할 수 있습니다.

위 내용은 Go\의 Query() 메서드를 사용할 때 SET 변수로 MySQL 쿼리를 실행할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.