github.com/RevenueMonster/sqlike@v1.0.6/examples/insert.go (about)

     1  package examples
     2  
     3  import (
     4  	"context"
     5  	"database/sql"
     6  	"testing"
     7  	"time"
     8  
     9  	"cloud.google.com/go/civil"
    10  	"github.com/RevenueMonster/sqlike/sql/expr"
    11  	"github.com/RevenueMonster/sqlike/sqlike"
    12  	"github.com/RevenueMonster/sqlike/sqlike/actions"
    13  	"github.com/RevenueMonster/sqlike/sqlike/options"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  // InsertExamples :
    18  func InsertExamples(ctx context.Context, t *testing.T, db *sqlike.Database) {
    19  	var (
    20  		err      error
    21  		result   sql.Result
    22  		affected int64
    23  	)
    24  
    25  	table := db.Table("NormalStruct")
    26  	ns := newNormalStruct()
    27  
    28  	// Single insert
    29  	{
    30  		result, err = table.InsertOne(
    31  			ctx,
    32  			&ns,
    33  			options.InsertOne().
    34  				SetOmitFields("Int").
    35  				SetDebug(true))
    36  		require.NoError(t, err)
    37  		affected, err = result.RowsAffected()
    38  		require.NoError(t, err)
    39  		require.Equal(t, int64(1), affected)
    40  	}
    41  
    42  	// Single upsert
    43  	// - https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
    44  	{
    45  		ns.Emoji = `🤕`
    46  		m := make(map[string]int)
    47  		m["one"] = 1
    48  		m["two"] = 2
    49  		ns.Map = m
    50  		result, err = table.InsertOne(
    51  			ctx,
    52  			&ns,
    53  			options.InsertOne().
    54  				SetDebug(true).
    55  				SetMode(options.InsertOnDuplicate))
    56  		require.NoError(t, err)
    57  		affected, err = result.RowsAffected()
    58  		require.NoError(t, err)
    59  		// upsert affected is 2 instead of 1
    60  		require.Equal(t, int64(2), affected)
    61  
    62  	}
    63  
    64  	// upsert with omitfield
    65  	{
    66  		ns2 := newNormalStruct()
    67  		result, err = table.InsertOne(
    68  			ctx,
    69  			&ns2,
    70  			options.InsertOne().
    71  				SetDebug(true).
    72  				SetMode(options.InsertOnDuplicate))
    73  		require.NoError(t, err)
    74  		affected, err = result.RowsAffected()
    75  		require.NoError(t, err)
    76  		require.Equal(t, int64(1), affected)
    77  
    78  		temp := ns2
    79  		temp.Date = civil.Date{Year: 2020, Month: 12, Day: 7}
    80  		temp.BigUint = 188
    81  		temp.BigInt = 188
    82  		temp.Byte = []byte("testing 123")
    83  		temp.Emoji = "🥶 😱 😨 😰"
    84  		result, err = table.InsertOne(
    85  			ctx,
    86  			&temp,
    87  			options.InsertOne().
    88  				SetOmitFields("Date", "BigUint", "EmptyByte", "Byte").
    89  				SetDebug(true).
    90  				SetMode(options.InsertOnDuplicate))
    91  		require.NoError(t, err)
    92  		affected, err = result.RowsAffected()
    93  		require.NoError(t, err)
    94  		// upsert affected is 2 instead of 1
    95  		require.Equal(t, int64(2), affected)
    96  
    97  		var o normalStruct
    98  		err = table.FindOne(
    99  			ctx,
   100  			actions.FindOne().
   101  				Where(
   102  					expr.Equal("$Key", ns2.ID),
   103  				),
   104  			options.FindOne().SetDebug(true),
   105  		).Decode(&o)
   106  		require.NoError(t, err)
   107  
   108  		// ensure the value didn't get modified on duplicate
   109  		require.Equal(t, o.BigUint, ns2.BigUint)
   110  		require.Equal(t, o.Byte, ns2.Byte)
   111  		require.NotEqual(t, o.BigInt, ns2.BigInt)
   112  		require.NotEqual(t, o.Emoji, ns2.Emoji)
   113  		require.Equal(t, o.Date.String(), ns2.Date.String())
   114  	}
   115  
   116  	// upsert with unordered primary key
   117  	{
   118  		type unorderedStruct struct {
   119  			Text   string
   120  			Number int8
   121  			ID     string `sqlike:",primary_key"`
   122  			Date   civil.Date
   123  		}
   124  
   125  		table := db.Table("unorderedStruct")
   126  		table.DropIfExists(ctx)
   127  		table.MustUnsafeMigrate(ctx, unorderedStruct{})
   128  		_, err = table.InsertOne(
   129  			ctx,
   130  			&unorderedStruct{
   131  				ID:   "224",
   132  				Date: civil.DateOf(time.Now()),
   133  			},
   134  			options.InsertOne().SetMode(options.InsertOnDuplicate),
   135  		)
   136  		require.NoError(t, err)
   137  	}
   138  
   139  	// Multiple insert
   140  	{
   141  		nss := [...]normalStruct{
   142  			newNormalStruct(),
   143  			newNormalStruct(),
   144  			newNormalStruct(),
   145  		}
   146  		result, err = table.Insert(
   147  			ctx,
   148  			&nss,
   149  			options.Insert().SetDebug(true),
   150  		)
   151  		require.NoError(t, err)
   152  		affected, err = result.RowsAffected()
   153  		require.NoError(t, err)
   154  		require.Equal(t, int64(3), affected)
   155  	}
   156  
   157  	table2 := db.Table("PtrStruct")
   158  
   159  	// Pointer insertion
   160  	{
   161  		_, err = table2.InsertOne(
   162  			ctx,
   163  			&ptrStruct{},
   164  			options.InsertOne().SetDebug(true),
   165  		)
   166  		require.NoError(t, err)
   167  	}
   168  
   169  	// Pointer insertion
   170  	{
   171  		ps := []ptrStruct{
   172  			newPtrStruct(),
   173  			newPtrStruct(),
   174  			newPtrStruct(),
   175  			newPtrStruct(),
   176  			newPtrStruct(),
   177  		}
   178  		_, err = table2.Insert(
   179  			ctx,
   180  			&ps,
   181  			options.Insert().SetDebug(true),
   182  		)
   183  		require.NoError(t, err)
   184  	}
   185  
   186  	// Error insertion
   187  	{
   188  		_, err = table.InsertOne(
   189  			ctx,
   190  			&struct {
   191  				Interface interface{}
   192  			}{},
   193  		)
   194  		require.Error(t, err)
   195  		_, err = table.InsertOne(ctx, struct{}{})
   196  		require.Error(t, err)
   197  		var empty *struct{}
   198  		_, err = table.InsertOne(ctx, empty)
   199  		require.Error(t, err)
   200  
   201  		_, err = table.Insert(ctx, []interface{}{})
   202  		require.Error(t, err)
   203  	}
   204  
   205  	table3 := db.Table("GeneratedStruct")
   206  
   207  	// generated column insertion
   208  	{
   209  		cols := []*generatedStruct{
   210  			newGeneratedStruct(),
   211  			newGeneratedStruct(),
   212  			newGeneratedStruct(),
   213  			newGeneratedStruct(),
   214  			newGeneratedStruct(),
   215  		}
   216  		_, err = table3.Insert(
   217  			ctx,
   218  			&cols,
   219  			options.Insert().SetDebug(true),
   220  		)
   221  		require.NoError(t, err)
   222  	}
   223  
   224  	{
   225  		table := db.Table("Override")
   226  		err := table.Truncate(ctx)
   227  		require.NoError(t, err)
   228  		table.MustUnsafeMigrate(ctx, overrideStruct{})
   229  
   230  		now, err := time.Parse("2006-01-02 15:04:05", "2018-01-01 00:00:00")
   231  		require.NoError(t, err)
   232  
   233  		os := overrideStruct{}
   234  		os.Amount = 9000
   235  		os.Amount = 100
   236  		os.ID = 1007
   237  		os.generatedStruct.ID = ""
   238  		os.CivilDate = civil.DateOf(now)
   239  		os.CreatedAt = now
   240  		os.UpdatedAt = now
   241  		_, err = table.InsertOne(ctx, &os)
   242  		require.NoError(t, err)
   243  
   244  		var out overrideStruct
   245  		err = table.FindOne(
   246  			ctx,
   247  			actions.FindOne().
   248  				Where(
   249  					expr.Equal("ID", os.ID),
   250  				),
   251  		).Decode(&out)
   252  		require.NoError(t, err)
   253  
   254  		require.Equal(t, os.ID, out.ID)
   255  		require.Equal(t, now, out.CreatedAt)
   256  		require.Equal(t, now, out.UpdatedAt)
   257  		require.Equal(t, os.Amount, out.Amount)
   258  		require.Equal(t, os.CivilDate, out.CivilDate)
   259  	}
   260  }
   261  
   262  // InsertErrorExamples :
   263  func InsertErrorExamples(ctx context.Context, t *testing.T, db *sqlike.Database) {
   264  	var (
   265  		ns  normalStruct
   266  		err error
   267  	)
   268  
   269  	{
   270  		_, err = db.Table("NormalStruct").InsertOne(ctx, nil)
   271  		require.Error(t, err)
   272  
   273  		var uninitialized *normalStruct
   274  		_, err = db.Table("NormalStruct").InsertOne(ctx, uninitialized)
   275  		require.Error(t, err)
   276  
   277  		ns = normalStruct{}
   278  		_, err = db.Table("NormalStruct").InsertOne(ctx, ns)
   279  		require.Error(t, err)
   280  	}
   281  
   282  	{
   283  		_, err = db.Table("NormalStruct").Insert(
   284  			ctx,
   285  			[]normalStruct{},
   286  		)
   287  		require.Error(t, err)
   288  	}
   289  }