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

OSCHINA-MIRROR/gohouse-gorose

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

GoRose ORM

GoDoc Go Report Card GitHub release Gitter GitHub GitHub All Releases gorose-orm

  _______   ______   .______        ______        _______. _______ 
 /  _____| /  __  \  |   _  \      /  __  \      /       ||   ____|
|  |  __  |  |  |  | |  |_)  |    |  |  |  |    |   (----`|  |__   
|  | |_ | |  |  |  | |      /     |  |  |  |     \   \    |   __|  
|  |__| | |  `--'  | |  |\  \----.|  `--'  | .----)   |   |  |____ 
 \______|  \______/  | _| `._____| \______/  |_______/    |_______|

translations

English readme | 中文 readme

introduction

Gorose — это фреймворк ORM на языке Golang, вдохновлённый Eloquent от Laravel.
В версии 2.0 Gorose использует модульную архитектуру, взаимодействует через API интерфейса и строго полагается на нижний уровень. Каждый модуль можно разобрать и даже настроить по своему вкусу.
Схема модулей выглядит следующим образом:
gorose.2.0.jpg

установка

  • go.mod
require github.com/gohouse/gorose/v2 v2.1.2

Используйте так: import "github.com/gohouse/gorose/v2"

  • docker
docker run -it --rm ababy/gorose sh -c "go run main.go"

Образ Docker: ababy/gorose. Образ Docker содержит пакеты и среду выполнения, необходимые для работы с gorose. Посмотреть Dockerfile

  • go get
go get -u github.com/gohouse/gorose/v2

документация

2.x doc
1.x doc
0.x doc

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

предварительный просмотр API

db.Table().Fields().Distinct().Where().GroupBy().Having().OrderBy().Limit().Offset().Select()
db.Table().Data().Insert()
db.Table().Data().Where().Update()
db.Table().Where().Delete()

простой пример использования

package main
import (
    "fmt"
    "github.com/gohouse/gorose/v2"
    _ "github.com/mattn/go-sqlite3"
)
var err error
var engin *gorose.Engin
func init() {
    // Глобальная инициализация и повторное использование баз данных
    // Здесь движок необходимо сохранить глобально, используя либо глобальные переменные, либо синглтоны
    // Конфигурация & gorose. Config {} — это конфигурация одной базы данных
    // Если вы настраиваете кластер с разделением чтения и записи, используйте & gorose. ConfigCluster {}
    engin, err = gorose.Open(&gorose.Config{Driver: "sqlite3", Dsn: "./db.sqlite"})
    // Пример MySQL, не забудьте импортировать драйвер MySQL из github.com/go-sql-driver/mysql
    // engin, err = gorose.Open(&gorose.Config{Driver: "mysql", Dsn: "root:root@tcp(localhost:3306)/test?charset=utf8&parseTime=true"})
}
func DB() gorose.IOrm {
    return engin.NewOrm()
}
func main() {
    // Собственный SQL, возвращает результаты напрямую
    res,err := DB().Query("select * from users where uid>? limit 2", 1)
    fmt.Println(res)
    affected_rows,err := DB().Execute("delete from users")
    fmt.Printf("affected rows: %d\n", affected_rows)
}
``` Вот перевод текста на русский язык:

**где uid=?», 1)**
    fmt.Println(affected_rows, err)

    // orm chan operation, fetch one row
    res, err := DB().Table("users").First()
    // res's type is map[string]interface{}
    fmt.Println(res)
    
    // rm chan operation, fetch more rows
    res2, _ := DB().Table("users").Get()
    // res2's type is []map[string]interface{}
    fmt.Println(res2)
}

## Использование
Gorose предоставляет привязку объектов данных (map, struct), поддерживая строковые имена таблиц и возврат данных в виде карты. Это обеспечивает большую гибкость.

Рекомендуется использовать привязку данных в качестве приоритета для выполнения операций запроса, чтобы можно было контролировать тип источника данных.
Gorose предлагает стандартные типы `gorose. Map` и `gorose. Data`, чтобы упростить инициализацию привязок и данных.

## Конфигурация и инициализация ссылок
Простая конфигурация
```go
var configSimple = &gorose.Config{
    Driver: "sqlite3", 
    Dsn: "./db.sqlite",
}

Более сложные конфигурации позволяют настроить кластер или даже несколько баз данных в кластере одновременно. База данных случайным образом выбирает базу данных кластера для выполнения соответствующих операций чтения и записи, где мастер является базой данных записи, а ведомый — базой данных чтения. Необходимо выполнить репликацию ведущий-ведомый, здесь только ответственность за чтение и запись.

var config = &gorose.ConfigCluster{
    Master:       []&gorose.Config{}{configSimple}
    Slave:        []&gorose.Config{}{configSimple}
    Prefix:       "pre_",
    Driver:       "sqlite3",
}

Начальное использование

var engin *gorose.Engin
engin, err := Open(config)

if err != nil {
    panic(err.Error())
}

Собственные операции SQL (добавление, удаление, проверка), использование сессии

Создание пользовательских таблиц users

DROP TABLE IF EXISTS "users";
CREATE TABLE "users" (
     "uid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
     "name" TEXT NOT NULL,
     "age" integer NOT NULL
);

INSERT INTO "users" VALUES (1, 'gorose', 18);
INSERT INTO "users" VALUES (2, 'goroom', 18);
INSERT INTO "users" VALUES (3, 'fizzday', 18);

Определение структуры таблицы

type Users struct {
    Uid  int    `gorose:"uid"`
    Name string `gorose:"name"`
    Age  int    `gorose:"age"`
}
// Устанавливаем имя таблицы. Если нет, по умолчанию используется имя структуры
func (u *Users) TableName() string {
    return "users"
}

Собственная операция запроса

// Здесь объект структуры должен быть привязан
// Если вы не определяете структуру, вы можете напрямую использовать карту map, пример map
// var u = gorose.Data{}
// var u = gorose.Map{} Оба варианта возможны.
var u Users
session := engin.NewSession()
// Здесь Bind () используется для хранения результатов. Если вы используете инициализацию NewOrm (), вы можете использовать NewOrm (). Table (). Query () напрямую.
_,err := session.Bind(&u).Query("select * from users where uid=? limit 2", 1)
fmt.Println(err)
fmt.Println(u)
fmt.Println(session.LastSql())

Собственное добавление, удаление и обновление

session.Execute("insert into users(name,age) values(?,?)(?,?)", "gorose",18,"fizzday",19)
session.Execute("update users set name=? where uid=?","gorose",1)
session.Execute("delete from users where uid=?", 1)

Объектно-реляционное отображение, использование ORM

    1. Базовое использование цепочки
var u Users
db := engin.NewOrm()
err := db.Table(&u).Fields("name").AddFields("uid","age").Distinct().Where("uid",">",0).OrWhere("age",18).
    Group("age").Having("age>1").OrderBy("uid desc").Limit(10).Offset(1).Select()
    1. Если вы не хотите определять структуру и хотите связать результаты карты определённого типа, вы можете определить типы карт, такие как
type user gorose.Map
// Или следующие определения типов могут быть правильно проанализированы
type user2 map[string]interface{}
type users3 []user
type users4 []map[string]string
type users5 []gorose.Map
type users6 []gorose.Data

Начните использовать привязку карты

db.Table(&user).Select()
db.Table(&users4).Limit(5).Select()

Примечание: если структура данных среза не используется, можно получить только один фрагмент данных. ``` // fetch a row var u Users // bind result to user{} err = db.Table(&u).Fields("uid,name,age").Where("age",">",0).OrderBy("uid desc").Select() if err!=nil { fmt.Println(err) } fmt.Println(u, u.Name) fmt.Println(db.LastSql())

// fetch multi rows // bind result to []Users, db and context condition parameters are reused here // If you don't want to reuse, you can use DB() to open a new session, or db.Reset() // db.Reset() only removes contextual parameter interference, does not change links, DB() will change links. var u2 []Users err = db.Limit(10).Offset(1).Select() fmt.Println(u2)

// count var count int64 // Here reset clears the parameter interference of the upper query and can count all the data. If it is not clear, the condition is the condition of the upper query. // At the same time, DB () can be called new, without interference. count,err = db.Reset().Count() // or count, err = DB().Table(&u).Count() fmt.Println(count, err)


**Advanced Usage**

- Chunk Data Fragmentation, Mass Data Batch Processing (Cumulative Processing)  

   `When a large amount of data needs to be manipulated, the chunk method can be used if it is unreasonable to take it out at one time and then operate it again.  
The first parameter of chunk is the amount of data specified for a single operation. According to the volume of business, 100 or 1000 can be selected.  
The second parameter of chunk is a callback method for writing normal data processing logic  
The goal is to process large amounts of data senselessly  
The principle of implementation is that each operation automatically records the current operation position, and the next time the data is retrieved again, the data is retrieved from the current position.`

```go
User := db.Table("users")
User.Fields("id, name").Where("id",">",2).Chunk(2, func(data []gorose.Data) error {
        // for _,item := range data {
        //     fmt.Println(item)
        // }
        fmt.Println(data)
        
        // don't forget return error or nil
        return nil
    })

    // print result:  
    // map[id:3 name:gorose]
    // map[id:4 name:fizzday]
    // map[id:5 name:fizz3]
    // map[id:6 name:gohouse]
    [map[id:3 name:gorose] map[name:fizzday id:4]]
    [map[id:5 name:fizz3] map[id:6 name:gohouse]]
  • Loop Data fragmentation, mass data batch processing (from scratch)

    Similar to chunk method, the implementation principle is that every operation is to fetch data from the beginning. Reason: When we change data, the result of the change may affect the result of our data taking as where condition, so we can use Loop.

User := db.Table("users")
User.Fields("id, name").Where("id",">",2).Loop(2, func(data []gorose.Data) error {
        // for _,item := range data {
        //     fmt.Println(item)
        // }
        // here run update / delete  
        
        // don't forget return error or nil
        return nil
    })
  • where nested
// SELECT  * FROM users  
//     WHERE  id > 1 
//         and ( name = 'fizz' 
//             or ( name = 'fizz2' 
//                 and ( name = 'fizz3' or website like 'fizzday%')
//                 )
//             ) 
//     and job = 'it' LIMIT 1
User := db.Table("users")
User.Where("id", ">", 1).Where(func() {
            User.Where("name", "fizz").OrWhere(func() {
                User.Where("name", "fizz2").Where(func() {
                    User.Where("name", "fizz3").OrWhere("website", "like", "fizzday%")
                })
            })
        }).Where("job", "it").First()

release log

  • v2.1.x:
    • update join with auto table prefix
    • add query return with []map[string]interface{}
  • v2.0.0: new version, new structure

Upgrade Guide

from 2.0.x to 2.1.x

  • change xxx.Join("pre_tablename") into xxx.Join("tablename"),the join table name auto prefix change err:=DB().Bind().Query() into res,err:=DB().Query() with multi return,leave the Bind() method as well

from 1.x to 2.x, install it for new


заплатите мне за кофе

wechat alipay paypal: click
  • список платежей
сумма аватар
100 юаней

Комментарии ( 0 )

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

Введение

Описание недоступно Развернуть Свернуть
MIT
Отмена

Обновления

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

Участники

все

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

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