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