Upgrade to Pro — share decks privately, control downloads, hide ads and more …

reform: путь к лучшему ORM

reform: путь к лучшему ORM

Alexey Palazhchenko

May 14, 2016
Tweet

More Decks by Alexey Palazhchenko

Other Decks in Programming

Transcript

  1. Цели database/sql src/database/sql/doc.txt • generic database API for SQL/SQL-like, feel

    like Go • common cases, portable, no quirks • consistent but flexible type conversions • concurrency, thread safety, built-in pool • push complexity to drivers via optional interfaces
  2. Интерфейс database/sql • DB: Open, Close, Begin, Prepare, Driver •

    DB, Stmt, Tx: Query, QueryRow, Exec • Rows: Next, Scan, Err, Close • Result: LastInsertId, RowsAffected • NullBool, NullInt64, NullFloat64, NullString • Scanner: Scan(src interface{}) error
  3. SELECT defer rows.Close() for rows.Next() { var name string if

    e := rows.Scan(&name); e != nil { log.Fatal(e) } fmt.Println(name) } if e := rows.Err(); e != nil { log.Fatal(e) }
  4. database/sql/driver.Value • nil • int64 • float64 • bool •

    []byte (non-nil) • string everywhere except from Rows.Next. #6497 • time.Time (боль с часовыми зонами)
  5. Свои типы func (j JSONText) Value() (driver.Value, error) { if

    j == nil { return nil, nil } var m json.RawMessage err := json.Unmarshal(j, &m) if err != nil { return []byte{}, err } return []byte(j), nil }
  6. Свои типы func (j *JSONText) Scan(value interface{}) error { if

    value == nil { *j = nil return nil } v, ok := value.([]byte) if !ok { return fmt.Errorf("error") } *j = JSONText(append((*j)[0:0], v...)) return nil }
  7. SELECT defer rows.Close() for rows.Next() { var name string if

    e := rows.Scan(&name); e != nil { log.Fatal(e) } fmt.Println(name) } if e := rows.Err(); e != nil { log.Fatal(e) }
  8. Идея: struct для данных type Person struct { ID int64

    `sql:"id,omitempty"` Name string `sql:"name,omitempty"` }
  9. Идея: непустые интерфейсы type Record interface { Values() []interface{} Pointers()

    []interface{} PrimaryKeyPointer() interface{} SetPrimaryKey(id interface{}) Table() Table } funс Save(record Record) error
  10. Идея: генерация кода • struct и код из XML •

    XML из information_schema • struct пишется, код генерируется из него
  11. Проблемы: Go vs SQL • SQL: значения по-умолчанию • SQL:

    отсутствие в запросе • Go: zero value