Shorm — это инструмент ORM, написанный на Go, который поддерживает шардинг баз данных и режим главного сервера-получателя.
go get github.com/shengzhi/shorm
- Если нет значения шардинга, SQL-запрос будет выполнен против всех групп.
- Если значение шардинга находится в диапазоне [0,3), SQL-запрос будет выполнен против Group1.
- Если значение шардинга находится в диапазоне [3,5), SQL-запрос будет выполнен против Group2.- Создание движка из файла конфигурации
```Go
engine, err := shorm.NewEngineFromConfig("cluster_config.json")
CREATE TABLE T_User (
UserId BIGINT NOT NULL,
UserName VARCHAR(50) NOT NULL DEFAULT '',
Age INT NOT NULL DEFAULT 0,
CreatedTime DATETIME NOT NULL DEFAULT GETDATE()
);
ALTER TABLE T_User ADD CONSTRAINT PK_User PRIMARY KEY (UserId);
type User struct {
TabName shorm.TableName `shorm:"T_User"`
Id int64 `shorm:"UserId,pk,shard"`
UserName string
Age int32
CreatedTime time.Time
}
func (u User) GetShardValue() int64 {
return u.Id
}
s := engine.StartSession()
defer engine.EndSession(s)
u := User{}
s.ShardValue(1).Id(1).Get(&u)
это сгенерирует SQL в виде ниже:
SELECT TOP 1 * FROM T_User WHERE UserId = 1
и будет локализовать базу данных "G1_node1"
shorm предоставляет три способа для локализации базы данных
s.ShardValue(значение int64)
, с наивысшим приоритетомShardinger
, с более высоким приоритетом"shard"
в структуре shorm
, с наименьшим приоритетомОперации запроса - Пропустить колонки
Go s.Пропустить("CreatedTime").Получить(&u)
s.Колонки("UserId, UserName").Получить(&u)
var slice []*Пользователь
s.Где("Age > ?", 18).Найти(&slice)
type ВозрастающийПользователь []*Пользователь
``` func(лист ВозрастающийПользователь) Длина() int {
return len(лист)
}
func(лист ВозрастающийПользователь) Меньше(i, j int) bool {
return лист[i].Id < лист[j].Id
}
func (лист ВозрастающийПользователь) Обменять(i, j int) {
лист[i], лист[j] = лист[j], лист[i]
}
minimum_id := 0
page_size := 10
page_index := 0
var slice ВозрастающийПользователь
s.Где("UserId>?", minimum_id).И("Age>?", 18).Ограничить(page_index*page_size, page_size).Найти(&slice)
sort.Sort(slice)
return slice[:page_size]
type УбывающийПользователь []*Пользователь
func(лист УбывающийПользователь) Длина() int {
return len(лист)
}
func(лист УбывающийПользователь) Меньше(i, j int) bool {
return лист[i].Id > лист[j].Id
}
func (лист УбывающийПользователь) Обменять(i, j int) {
лист[i], лист[j] = лист[j], лист[i]
}
maximum_id := math.MaxInt64
page_size := 10
page_index := 0
var slice ВозрастающийПользователь
s.Где("UserId<?", maximum_id).И("Age>?", 18).Отсортировать("UserId desc").Ограничить(page_index*page_size, page_size).Найти(&slice)
sort.Sort(slice)
return slice[:page_size]
- Операция IN
```Go
s.ShardValue(100).IN("UserId", 12, 234, 345).Найти(&slice)
s.ShardValue(100).BETWEEN("UserId", 10, 100).Найти(&slice)
Вставка данных
Вставка одной записи
var user User = User{
Id: 1001,
UserName: "Test",
Age: 18,
CreatedTime: time.Now(),
}
count, err := s.Insert(&user)
var users *User = new(User)
result, err := s.InsertSlice(users)
fmt.Println(result.Success)
fmt.Println(result.FailedData)
``` - Транзакция базы данных (поддерживает только одну транзакцию в базе данных)
```Go
trans, err := engine.BeginTrans(shardValue)
if _, err = trans.Insert(&user1); err != nil {
trans.Rollback()
return
}
if _, err = trans.InsertSlice(&orderList); err != nil {
trans.Rollback()
return
}
trans.Commit()
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )