【问题标题】:What is the correct way to use ' and " for indicating db column names?使用 ' 和 " 指示数据库列名的正确方法是什么?
【发布时间】:2015-07-23 12:15:13
【问题描述】:

我的数据库中有一个表,其列名都以大写字母开头(即:FMR_Number、Primary_Value)。列名是我无法控制的。数据库中的所有其他列(在其他表中)都是小写的。我已经将一个结构映射到表,但我不断从查询中得到一个丢失的目标错误。我相信这是因为名称映射器设置为 ToLower(这是它在其他任何地方都需要的)。我尝试使用这种格式

StructField string 'db:"RealColumnName"'  

明确指定映射,但我得到一个非法的符文文字。当我去查看其他人代码中的示例时,我发现它以我刚刚尝试过的方式表示。如果我将 ' 和 " 反转为

StructField string "db:'RealColumnName'"  

我没有收到非法符文文字错误,但确实收到了丢失的目的地错误。我在这里做错了什么?我正在使用 sqlx。

我的结构

type pah struct {
    FMR_Fund_Number                  string  'db:"FMR_Fund_Number"'
    Business_Data_Date               string  'db:"Business_Data_Date"'
    Outbound_Composition_Code        string  'db:"Outbound_Composition_Code"'
    Composition_Sub_Code             string  'db:"Composition_Sub_Code"'
    Composition_Sub_Code_Description string  'db:"Composition_Sub_Code_Description"'
    Position_Name                    string  'db:"Position_Name"'
    Primary_Value                    float64 'db:"Primary_Value"'
    Record_Order                     int     'db:"Record_Order"'
    Tier_Indicator                   string  'db:"Tier_Indicator"'
}

我的数据库调用

func loadAssetAllocation() AssetAllocations {
    pahGroup := []pah{}
    pahQuery := "SELECT FMR_Fund_Number,Business_Data_Date,Outbound_Composition_Code,Composition_Sub_Code,Composition_Sub_Code_Description,Primary_Value,Tier_Indicator,Record_Order FROM PAH WHERE FMR_Fund_Number = \"312\" AND Outbound_Composition_Code = \"MDCAT\" AND Business_Data_Date = (SELECT Business_Data_Date FROM PAH ORDER BY Business_Data_Date DESC LIMIT 1) AND Composition_Sub_Code <> \"TAXADV\" ORDER BY Record_Order ASC"
    assetAlloc := AssetAllocations{}
    err := ffDB.Select(&pahGroup, pahQuery)
    fmt.Println("pahQuery AssetAllocation error: ", err)
    assetAlloc.AssetAll = pahGroup
    return assetAlloc
}

【问题讨论】:

    标签: mysql go


    【解决方案1】:

    结构标签使用反引号 - ` 字符(通常在美国键盘布局的 Esc 键下) - 而不是单引号。

    您的结构应该如下所示,注意变量名中的下划线在 Go 中并不是特别惯用的。

    您使用结构标签的原因通常是将导出的(大写的)Go 结构字段名称映射到其他事物(JSON、数据库、HTML 表单等)使用的名称。

    type pah struct {
        FMRFundNumber                  string  `db:"FMR_Fund_Number"`
        BusinessDataDate               string  `db:"Business_Data_Date"`
        OutboundCompositionCode        string  `db:"Outbound_Composition_Code"`
        CompositionSubCode             string  `db:"Composition_Sub_Code"`
        CompositionSubCodeDescription string  `db:"Composition_Sub_Code_Description"`
        PositionName                    string  `db:"Position_Name"`
        PrimaryValue                    float64 `db:"Primary_Value"`
        RecordOrder                     int     `db:"Record_Order"`
        TierIndicator                   string  `db:"Tier_Indicator"`
    }
    

    请参阅文档:http://golang.org/pkg/reflect/#StructTaghttp://golang.org/pkg/encoding/json/#Marshal

    【讨论】:

    • 结构标签必须是字符串文字。人们通常使用反引号语法,因为它不需要转义嵌入的引号,但是像 "db:\"FMR_Fund_Number\"" 这样的标签同样正确。
    • @JamesHenstridge 是的,正确的。试图保持低混淆 - 我认为我还没有在“野外”看到过非反引号案例(永远不要说永远)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 2015-04-08
    • 1970-01-01
    • 2020-01-28
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多