github.com/mailru/activerecord@v1.12.2/docs/cookbook.md (about) 1 # Рецепты 2 3 В этом документе представлены основные рецепты по использованию библиотеки. 4 Эта библиотека представляет из себя набор пакетов для подключения в приложение и утилиту для генерации. 5 6 ## Декларативное описание 7 8 ### Декларирование конфигурации хранилища 9 10 ```go 11 //ar:shard_by_func:shard_func 12 //ar:shard_by_field:Id:7 13 //ar:serverHost:127.0.0.1;serverPort:12345;serverTimeout:500;serverUser:test;serverPass:test 14 //ar:backend:octopus,tarantool 15 ``` 16 17 ### Декларирование полей 18 19 ### Декларирование связанных сущностей 20 21 ### Декларирование индексов 22 23 #### Частичные индексы 24 25 ### Декларирование триггеров 26 27 ### Декларирование флагов 28 29 ## Конфигурирование 30 31 ### Интерфейс конфига 32 33 Интерфейс конфига очень схож с реализацией `onlineconf`. 34 35 Но на самом деле можно реализовать любую структуру, которая ему удовлетворяет. 36 37 Например, внутри проекта в котором вы используете AR, можно создать структуру `ARConfig`: 38 39 ```golang 40 type ARConfig struct { 41 updatedIn time.Time 42 } 43 44 func NewARConfig() *ARConfig { 45 arcfg := &ARConfig{ 46 updatedIn: time.Now(), 47 } 48 49 return arcfg 50 } 51 52 func (dc *ARConfig) GetLastUpdateTime() time.Time { 53 return dc.updatedIn 54 } 55 56 func (dc *ARConfig) GetBool(ctx context.Context, confPath string, dfl ...bool) bool { 57 if len(dfl) != 0 { 58 return dfl[0] 59 } 60 61 return false 62 } 63 func (dc *ARConfig) GetBoolIfExists(ctx context.Context, confPath string) (value bool, ok bool) { 64 return false, false 65 } 66 67 func (dc *ARConfig) GetDurationIfExists(ctx context.Context, confPath string) (time.Duration, bool) { 68 switch confPath { 69 case "arcfg/Timeout": 70 return time.Millisecond * 200, true 71 default: 72 return 0, false 73 } 74 } 75 func (dc *ARConfig) GetDuration(ctx context.Context, confPath string, dfl ...time.Duration) time.Duration { 76 ret, ok := dc.GetDurationIfExists(ctx, confPath) 77 if !ok && len(dfl) != 0 { 78 ret = dfl[0] 79 } 80 81 return ret 82 } 83 84 func (dc *ARConfig) GetIntIfExists(ctx context.Context, confPath string) (int, bool) { 85 switch confPath { 86 case "arcfg/PoolSize": 87 return 10, true 88 default: 89 return 0, false 90 } 91 } 92 func (dc *ARConfig) GetInt(ctx context.Context, confPath string, dfl ...int) int { 93 ret, ok := dc.GetIntIfExists(ctx, confPath) 94 if !ok && len(dfl) != 0 { 95 ret = dfl[0] 96 } 97 98 return ret 99 } 100 101 func (dc *ARConfig) GetStringIfExists(ctx context.Context, confPath string) (string, bool) { 102 switch confPath { 103 case "arcfg/master": 104 return "127.0.0.1:11011", true 105 case "arcfg/replica": 106 return "127.0.0.1:11011", true 107 default: 108 return "", false 109 } 110 } 111 func (dc *ARConfig) GetString(ctx context.Context, confPath string, dfl ...string) string { 112 ret, ok := dc.GetStringIfExists(ctx, confPath) 113 if !ok && len(dfl) != 0 { 114 ret = dfl[0] 115 } 116 117 return ret 118 } 119 120 func (dc *ARConfig) GetStrings(ctx context.Context, confPath string, dfl []string) []string { 121 return []string{} 122 } 123 func (dc *ARConfig) GetStruct(ctx context.Context, confPath string, valuePtr interface{}) (bool, error) { 124 return false, nil 125 } 126 ``` 127 128 Это статический конфиг, и в таком виде он кажется избыточным, но можно передать при инициализации такого пакета конфиг приложения, который может 129 изменять свои параметры в течении времени. Тогда необходимо в методе `GetLastUpdateTime` отдавать время последнего обновления конфига. 130 Это позволит перечитывать параметры подключения на лету и пере-подключаться к базе. 131 132 ## Атомарность на уровне БД 133 134 ### Мутаторы 135 136 ## Архитектурное построение 137 138 ## Best practices