SET 변수를 사용하여 MySQL 쿼리에 대한 Go의 구문 오류를 해결하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-10-24 04:33:30
원래의
778명이 탐색했습니다.

How to Resolve Syntax Errors in Go for MySQL Queries Using SET Variables?

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

Go에서는 MySQL 쿼리를 실행하기 전에 SET 문을 사용할 수 있습니다. 그러나 충족해야 하는 특정 구문 요구 사항이 있습니다. 이 문서에서는 이러한 쿼리를 실행하려고 할 때 발생하는 문제를 살펴보고 해결책을 제공합니다.

원본 코드 조각에는 사용자 ID 및 정렬 매개변수를 기반으로 레코드를 선택하는 함수 정의가 포함됩니다. 쿼리를 실행하기 전에 SET 문을 사용하여 변수에 값을 할당합니다. 그러나 이 접근 방식은 Go를 통해 실행할 때 구문 오류가 발생했습니다.

오류는 쿼리 구성 방식으로 인해 발생할 수 있습니다. 특히 SET 문은 괄호로 묶어서 SELECT 문 앞에 배치해야 합니다. 또한 MySQL DSN에는 "multiStatements=true" 및 "interpolateParams=true" 설정이 포함되어야 합니다.

다음 업데이트된 코드 조각으로 문제를 해결합니다.

<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 ?,?;
    `

    dsn := d.dsn + "?multiStatements=true&interpolateParams=true"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        return nil, err
    }
    defer db.Close()

    rows, err := db.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>
로그인 후 복사

SET 문을 포함하여 문제를 해결합니다. 괄호로 묶고 DSN에서 다중 문과 매개변수 보간을 활성화하면 쿼리는 구문 오류 없이 Go에서 성공적으로 실행됩니다. 또한 데이터베이스와 테이블을 utf8mb4_general_ci 데이터 정렬로 변환하면 문자 집합 호환성과 관련된 잠재적인 문제가 해결됩니다.

위 내용은 SET 변수를 사용하여 MySQL 쿼리에 대한 Go의 구문 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!