code: func Statements(dst io.Writer, from, to model.Stmts, options ...Option) error {
  	var txn bool
  	for _, o := range options {
  		switch o.Name() {
  		case optkeyTransaction:
  			txn = o.Value().(bool)
  		}
  	}
  
  	ctx := newDiffCtx(from, to)
  
  	var procs = []func(*diffCtx, io.Writer) (int64, error){
  		dropTables,
  		createTables,
  		alterTables,
  	}
  
  	var buf bytes.Buffer
  	if txn {
  		buf.WriteString("\nBEGIN;\n\nSET FOREIGN_KEY_CHECKS = 0;")
  	}
  
  	for _, p := range procs {
  		var pbuf bytes.Buffer
  		n, err := p(ctx, &pbuf)
  		if err != nil {
  			return errors.Wrap(err, `failed to produce diff`)
  		}
  		if txn && n > 0 || !txn && buf.Len() > 0 && n > 0 {
  			buf.WriteString("\n\n")
  		}
  		pbuf.WriteTo(&buf)
  	}
  	if txn {
  		buf.WriteString("\n\nSET FOREIGN_KEY_CHECKS = 1;\n\nCOMMIT;")
  	}
  
  	if _, err := buf.WriteTo(dst); err != nil {
  		return errors.Wrap(err, `failed to write diff`)
  	}
  	return nil
  }
docs: // Statements compares two model.Stmts and generates a series
  // of statements to migrate from the old one to the new one,
  // writing the result to `dst`