1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/jongsz-shorm

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Shorm

Shorm — это инструмент ORM, написанный на Go, который поддерживает шардинг баз данных и режим главного сервера-получателя.

Установка

go get github.com/shengzhi/shorm

Возможности

  • Поддержка отображения структур в таблицах
  • Прямолинейный API
  • Поддержка транзакций
  • Поддержка как ORM, так и сырых SQL запросов
  • Поддержка кластеризации баз данных
  • Поддержка режима главного сервера-получателя
  • Поддержка полей структуры, которые будут храниться в виде JSON строки

Поддерживаемые драйверы

Журнал изменений

Быстрый старт

  • Создание движка из кода```Go cluster := &Cluster{TotalGroups: 5} cluster.Groups = append(cluster.Groups, &DbGroup{ IsDefault: true, RangeFrom: 0, RangeTo: 3, Name: "Group1", Nodes: []*DbNode{ { Name: "G1_Master", ConnStr: connstr, Type: NodeType_Master, }, { Name: "G1_Node1", ConnStr: connstr, Type: NodeType_Slave, }, }, }, ) cluster.Groups = append(cluster.Groups, &DbGroup{ RangeFrom: 3, RangeTo: 5, Name: "Group2", Nodes: []*DbNode{ { Name: "G2_Master", ConnStr: connstr2, Type: NodeType_Master, }, { Name: "G2_Node1", ConnStr: connstr2, Type: NodeType_Slave, }, }, }) engine := shorm.NewEngine("mssql", &cluster)
- Если нет значения шардинга, SQL-запрос будет выполнен против всех групп.
- Если значение шардинга находится в диапазоне [0,3), SQL-запрос будет выполнен против Group1.
- Если значение шардинга находится в диапазоне [3,5), SQL-запрос будет выполнен против Group2.- Создание движка из файла конфигурации
```Go
engine, err := shorm.NewEngineFromConfig("cluster_config.json")
  • Определение структуры Go для отображения данных таблицы
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), с наивысшим приоритетом
    • Структура Go реализует интерфейс Shardinger, с более высоким приоритетом
    • Маркировка поля значением "shard" в структуре shorm, с наименьшим приоритетом
  • Операции запроса - Пропустить колонки Go s.Пропустить("CreatedTime").Получить(&u)

    • Включить указанные колонки, игнорировать остальные
     	s.Колонки("UserId, UserName").Получить(&u)
    • Запрос нескольких записей против всех групп
     	var slice []*Пользователь
     	s.Где("Age > ?", 18).Найти(&slice)
    • Пагинация, если значение шардинга не указано, shorm будет запрашивать данные из всех групп, так что коллекция структур должна реализовать интерфейс сортировки для достижения пагинации
     	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)
    • Операция BETWEEN
     	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 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
BSD-3-Clause
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/jongsz-shorm.git
git@api.gitlife.ru:oschina-mirror/jongsz-shorm.git
oschina-mirror
jongsz-shorm
jongsz-shorm
master