sqlboiler实践

一、Bind数据

1.1 如果Bind的结构引用了生成的models,请注意struct字段不能设置为指针类型

  • 错误示例, 定义指针类型的字段会引起数据无法赋值

    type Xxx struct {
    User *models.User `boil:",bind"`
    }
  • 正确示例

    type Xxx struct {
    User models.User `boil:",bind"`
    }

1.2 如果Bind的结构需要引用多个生成的models, 定义bind结构的时候需要特别注意以下:

  • 如果要引用多个生成的models, 推荐使用匿名方式定义结构体,这个时候bind的tag中不需要声明表名,默认以生成的表名去遍历

    type Xxx struct {
    models.User `boil:",bind"`
    models.UserProfile `boil:",bind"`
    }
  • 如果一定要以非匿名字段的方式引入多个生成的models, 请注意判断不同表中是否有相同的字段,如果有则需要在bind的tag中指定表名

    type Xxx struct {
    User models.User `boil:"user,bind"`
    UserProfile models.UserProfile `boil:"userprofile,bind"`
    }

二、多表JOIN

2.1 如果多表JOIN,在用QueryMod方式构造SQL的时候,需要认真考虑什么时候使用带表名的字段名,什么时候使用单独的字段名,否则不同表同名字段会引起SQL解析错误

2.1.1 建议使用带表名的字段table.field的场景, 即使用[表名]TableColumns变量
  • Bind结构体中匿名引入的models,在对应的QueryMod中需要用[表名]TableColumns变量, 例如

    type Xxs struct {
    modles.Users `boil:",bind"`
    }
    models.Users(
    qm.Select(
        models.UserTableColumns.ID,
        ...
    )
    )
  • Bind结构体中非匿名引入的models,如果对应字段的tag中指明了表名,需要在对应的QueryMod中需要用[表名]TableColumns变量

    type Xxs struct {
    U modles.Users `boil:"user,bind"`
    }
    models.Users(
    qm.Select(
        models.UserTableColumns.ID,
        ...
    )
    )
    2.1.2 不建议使用带表名的字段table.field的场景, 即使用[表名]Columns变量

    所有不建议用带表名的字段基本都是需要特殊处理,为了保证后续的可维护性,不建议带表名

  • LeftJoin的表对应的字段有可能为空,需要特殊处理,这里[表名]Columns变量方便进行处理

    type Xxs struct {
    U modles.Users `boil:"user,bind"`
    address `boil:"address"`
    }
    models.Users(
    qm.Select(
        models.UserTableColumns.ID,
        models.UserProfileColumns.Address,
        ...
    )
    qm.LeftOuterJoin(....)
    )
  • 某些需要特殊处理的字段,需要特殊处理,这里建议用[表名]Columns变量方便进行处理

    type Xxs struct {
    U modles.Users `boil:"user,bind"`
    Favoriates []byte  `boil:"addresses"`
    }
    models.Users(
    qm.Select(
        models.UserTableColumns.ID,
        models.UserProfileColumns.Favoriates,
    )
    qm.LeftOuterJoin(....)
    )

2.2 如果使用LeftJoin,那么对应的数据表的引用值可能为空,请在Bind的结构中定义对应的sql.Null类型的字段,或者提前在SQL语句中用IFNULL进行处理

假设有以下的SQL, 如果某个用户的profile不存在,那么leftjoin的userprofile则为空

models.Users(
    qm.Select(
        models.UserTableColumns.ID,
        modeles.UserProfileTableColumns.Address,
    ),
    qm.LeftOuterJoin("userrole on userrole.id=user.id")
)
  • 解决方案一: 将可能为空的字段单独列出来,并用对应的sql.Null类型去定义

    type Xxx struct {
    User models.User `boil:"user,bind"`
    Address sql.NullString `boil:"userprofile,bind"`
    }
  • 解决方案二: 用IFNULL函数确保左连接的数据不为Null

    type Xxx struct {
    User models.User `boil:"user,bind"`
    UserProfile models.UserProfile `boil:"userprofile,bind"`
    }
    models.Users(
    qm.Select(
        models.UserTableColumns.ID,
        `IFNULL(` + modeles.UserProfileTableColumns.Address + `'') AS ` + modeles.UserProfileColumns.Address,
        ...
    ),
    qm.LeftOuterJoin("userrole on userrole.id=user.id")
    )
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇