GORM many2many预加载错误

时间:2017-02-05 06:24:10

标签: sql sqlite go go-gorm

目前使用GORM连接到两个数据库:POSTGRES和sqlite(使用代码开关选择使用哪个)。我的架构中定义了2个数据库表,如下所示:

type TableClient struct { 
    Model
    Synchronised bool
    FacilityID string `gorm:"primary_key"`
    Age                       int
    ClientSexID               int  
    MaritalStatusID           int
    SpecificNeeds             []TableOptionList`gorm:"many2many:options_specific_needs"`
}

type TableOptionList struct {
    ID        int `gorm:"primary_key"`
    Name    string
    Value   string
    Text    string
    SortKey int
  }

以前,我会使用以下代码预加载相关表:

var dbClient TableClient
Db.Where("facility_id = ? AND client_id = ? AND id = ?;", URLFacilityID, URLClientID, URLIncidentID).
   Preload("ClientSex").
   Preload("MaritalStatus").
   Preload("CareTakerRelationShip").
   Preload("HighestLevelOfEducation").
   Preload("Occupation").
   Preload("SpecificNeeds").
   First(&dbClient)

现在查找失败并出现语法错误,当我查看生成的SQL时,它显示生成了以下SQL:

SELECT * FROM "table_option_lists" INNER JOIN "options_specific_needs" ON       "options_specific_needs"."table_option_list_id" = "table_option_lists"."id" WHERE (("options_specific_needs"."table_client_id","options_specific_needs"."table_client_facility_id") IN (('one','LS034')))

将其粘贴到sqlite控制台也失败并出现相同的错误:(接近",":语法错误)

1 个答案:

答案 0 :(得分:0)

问题的关键在于你的WHERE子句,你需要使用" OR",而不是","。

这可能是GORM的一个问题,你可以为此打开一个GitHub问题。您可以使用GORM中的db.Raw()解决问题。一般来说,我更愿意避免使用ORM。部分原因是手工构建SQL查询通常比尝试找出在ORM中执行它的奇怪方法(对于基本CRUD之外的事情)更容易。