beego 中使用關聯查詢( join 查詢)
- 文檔所在網址:這裡
//使用執行個體:article:=new(Article)num,err:= o.QueryTable("go_article").RelatedSel().All(&article)
- 但直接使用 RelatedSel() 是不行,還必須先在 model中定義:
type User struct { Id int Name string Age int}type Article stuct { Id int Title string Content string User *User `orm:"rel(fk)"` //這樣寫,預設在Article中應該有一個user_id的欄位,如果沒有,通過beego自動建表的話,它會產生;如果是手動建表,記得把user_id 這個欄位加上去}
定義表欄位為"rel(fk)",即外鍵,要定義其它類型的,請看文檔。
- 命令列自動建表:
orm.RunCommand() //main函數或init函數中需要加這行代碼,否則不能自動建表
go build main.go #先在命令列中執行這句,會產生main.exe檔案./main orm syncdb -h #-h會提示可用的參數./main orm syncdb -v #建表的同時會顯示建表的sql語句
如果使用自動建表,建議不要像上邊一樣直接寫int,string,具體欄位欄位的方法,見 文檔
其實我使用命令列建表最主要的目的是想知道 Article 中的 User 會產生什麼欄位名,結果就是 user_id,且與你 User 對應表名的首碼沒有關係
- 疑問:
4.1 RelatedSel()可以選擇“欄位名” RelatedSel("user") 其實只是選擇“表名”(實際也不是表名,而是 struct 中對應欄位的小寫),只有當一個 model 中使用了多個 rel 欄位的時候才有意義。但怎麼選擇關聯的 user 表中的指定欄位?
4.2 RelatedSel()預設應該是 inner join,但我希望是 left join ,應該怎麼寫?
4.3 我想看到每次執行資料庫操作時使用的 sql 語句,怎麼查看?
- 一點感慨:
個人覺得 beego 內建的 orm 其實挺不好用的,有些概念也很不理解。
作為一個經常寫 ThinkPHP 3.2 的碼農,使用其它架構的 orm 的時候真的覺得太麻煩。
但話說 orm 到底有什麼優勢?其實我是一直不理解的,tp3.2 操作資料庫的方法真正好用的不是它的 orm,而是它的連貫操作寫起來真的很舒服。
其實 beego 的作者也做過一個獨立的 orm 用法和 tp3.2 也還是有點像的。
但 github 中能搜到了 star 最多的 go orm 應該是 gorm ,看文檔,發現它的用法其實與 tp3.2 的挺像的,我還是比較推薦使用 gorm 的。