代码之家  ›  专栏  ›  技术社区  ›  ufk

选择并使用sqlx

  •  0
  • ufk  · 技术社区  · 6 年前

    Get() ,或获取几行并将它们输入到 Select()

    让我们从将一行放入结构开始。

    我创建了以下结构:

    type PsqlProduct struct {
        Id              int64          `db:"product_id"`
        Name            string         `db:"product_name"`
        Desc            sql.NullString `db:"product_desc"`
        YearManufacture sql.NullInt64  `db:"year_manufacture"`
        Quantity        sql.NullInt64  `db:"quantity"`
    }
    

    QUERY_SELECT_PRODUCT = `select wd.product.id as product_id,
    trans_p_name.text as product_name,
    trans_p_desc.text as product_desc,
    wd.product.year_manufacture, wd.product.quantity
    from wd.product
    join wd.text_translation as trans_p_name 
        on trans_p_name.text_id = wd.product.product_name_trans_id and trans_p_name.lang_id=1
    left join wd.text_translation as trans_p_desc 
        on trans_p_desc.text_id = wd.product.product_desc_trans_id and trans_p_desc.lang_id=1
    where wd.product.id = $1 
    `
    

    func PsqlGetProductById(productId int) *Product {
        product := new(PsqlProduct)
        err := Psqldb.Get(&product, QUERY_SELECT_PRODUCT,productId)
        if err != nil {
            log.Fatalf("error: %v",err)
            return nil
        } else {
    
            newp := Product{
                ID:   uint(product.Id),
                Name: product.Name,
            }
            if product.Quantity.Valid {
                newp.Quantity = uint16(product.Quantity.Int64)
            }
            if product.YearManufacture.Valid {
                newp.YearManufacture = uint16(product.YearManufacture.Int64)
            }
            if product.Desc.Valid {
                newp.Desc = product.Desc.String
            }
            return &newp
        }
    }
    

    我发现了错误

    error: scannable dest type ptr with >1 columns (5) in result
    

    好像 获取()

    如果我换了 获取() 函数调用 Psqldb.QueryRowx(QUERY_SELECT_PRODUCT, productId).StructScan(product)

    不起作用。

    下一个。。 选择()

    所以这就是结构

    type PsqlCategory struct {
        Id               int64         `db:"category_id"`
        Name             string        `db:"category_name"`
        ParentCategoryId sql.NullInt64 `db:"parent_category_id"`
    }
    

    sql查询:

    QUERY_SELECT_CATEGORIES = `
    select category.id as category_id,
           text_translation.text as category_name,
           category.parent_category_id
    from category
    join text_translation on text_translation.text_id=category.category_name_trans_id
    and text_translation.lang_id = 1`
    

    func PsqlGetCategories() []Category {
        categories := []PsqlCategory{}
        err := Psqldb.Select(&categories, QUERY_SELECT_CATEGORIES)
        if err != nil {
            log.Fatalf("could not parse categories: %v", err)
            return nil
        }
        var nCategories []Category
        for _, cat := range categories {
            newCat := Category{
                Id:   cat.Id,
                Name: cat.Name,
            }
            if cat.ParentCategoryId.Valid {
                newCat.ParentCategoryId = cat.ParentCategoryId.Int64
            }
            nCategories = append(nCategories, newCat)
        }
        return nCategories
    }
    

    这就是错误

    could not parse categories: pq: relation "category" does not exist
    

    好像我完全误解了sqlx库的用法,或者我遗漏了一些东西。。

    关于这个问题的任何信息都将非常感谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   mkopriva    6 年前

    问题是因为你路过 **PsqlProduct Get "... dest type ptr with >1 columns ..." .

    只需改变:

    err := Psqldb.Get(&product, QUERY_SELECT_PRODUCT,productId)
    

    致:

    err := Psqldb.Get(product, QUERY_SELECT_PRODUCT,productId)