# 常見問題
- 如何使用Like?
答:
~~~
engine.Where("column like ?", "%"+char+"%").Find
~~~
- 怎么同時使用xorm的tag和json的tag?
答:使用空格
~~~
type User struct {
Name string `json:"name" xorm:"name"`
}
~~~
- 我的struct里面包含bool類型,為什么它不能作為條件也沒法用Update更新?
答:默認bool類型因為無法判斷是否為空,所以不會自動作為條件也不會作為Update的內容。可以使用UseBool函數,也可以使用Cols函數
~~~
engine.Cols("bool_field").Update(&Struct{BoolField:true})
// UPDATE struct SET bool_field = true
~~~
- 我的struct里面包含float64和float32類型,為什么用他們作為查詢條件總是不正確?
答:默認float32和float64映射到數據庫中為float,real,double這幾種類型,這幾種數據庫類型數據庫的實現一般都是非精確的。因此作為相等條件查詢有可能不會返回正確的結果。如果一定要作為查詢條件,請將數據庫中的類型定義為Numeric或者Decimal。
~~~
type account struct {
money float64 `xorm:"Numeric"`
}
~~~
- 為什么Update時Sqlite3返回的affected和其它數據庫不一樣?
答:Sqlite3默認Update時返回的是update的查詢條件的記錄數條數,不管記錄是否真的有更新。而Mysql和Postgres默認情況下都是只返回記錄中有字段改變的記錄數。
- xorm有幾種命名映射規則?
答:目前支持SnakeMapper和SameMapper兩種。SnakeMapper支持結構體和成員以駝峰式命名而數據庫表和字段以下劃線連接命名;SameMapper支持結構體和數據庫的命名保持一致的映射。
- xorm支持復合主鍵嗎?
答:支持。在定義時,如果有多個字段標記了pk,則這些字段自動成為復合主鍵,順序為在struct中出現的順序。在使用Id方法時,可以用`Id(xorm.PK{1, 2})`的方式來用。
- xorm如何使用Join?
答:一般我們配合Join()和extends標記來進行,比如我們要對兩個表進行Join操作,我們可以這樣:
~~~
type Userinfo struct {
Id int64
Name string
DetailId int64
}
type Userdetail struct {
Id int64
Gender int
}
type User struct {
Userinfo `xorm:"extends"`
Userdetail `xorm:"extends"`
}
var users = make([]User, 0)
err := engine.Table(&Userinfo{}).Join("LEFT", "userdetail", "userinfo.detail_id = userdetail.id").Find(&users)
~~~
請注意這里的Userinfo在User中的位置必須在Userdetail的前面,因為他在join語句中的順序在userdetail前面。如果順序不對,那么對于同名的列,有可能會賦值出錯。
當然,如果Join語句比較復雜,我們也可以直接用Sql函數
~~~
err := engine.Sql("select * from userinfo, userdetail where userinfo.detail_id = userdetail.id").Find(&users)
~~~
- 如果有自動增長的字段,Insert如何寫?答:Insert時,如果需要自增字段填充為自動增長的數值,請保持自增字段為0;如果自增字段為非0,自增字段將會被作為普通字段插入。