github.com/RevenueMonster/sqlike@v1.0.6/examples/update.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  	uuid "github.com/google/uuid"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  // UpdateExamples :
    19  func UpdateExamples(ctx context.Context, t *testing.T, db *sqlike.Database) {
    20  	var (
    21  		ns       normalStruct
    22  		err      error
    23  		result   sql.Result
    24  		affected int64
    25  	)
    26  
    27  	table := db.Table("NormalStruct")
    28  	uid, _ := uuid.Parse(`be72fc34-917b-11e9-af91-6c96cfd87b17`)
    29  	uid2, _ := uuid.Parse("ae608554-491c-4472-beac-97feef49e810")
    30  
    31  	{
    32  		ns = normalStruct{}
    33  		ns.ID = uid
    34  		ns.Timestamp = time.Now()
    35  		result, err = table.InsertOne(
    36  			ctx,
    37  			&ns,
    38  			options.InsertOne().
    39  				SetMode(options.InsertIgnore))
    40  		affected, _ = result.RowsAffected()
    41  		require.NoError(t, err)
    42  		require.Equal(t, int64(1), affected)
    43  
    44  		ns = normalStruct{}
    45  		ns.ID = uid2
    46  		ns.Timestamp = time.Now()
    47  		result, err = table.InsertOne(
    48  			ctx,
    49  			&ns,
    50  			options.InsertOne().
    51  				SetMode(options.InsertIgnore))
    52  		affected, _ = result.RowsAffected()
    53  		require.NoError(t, err)
    54  		require.Equal(t, int64(1), affected)
    55  	}
    56  
    57  	cnp := "✂️ Copy and 📋 Paste"
    58  	now := time.Now().UTC()
    59  	bigInt := int64(23127381237222)
    60  
    61  	{
    62  		// ModifyOne
    63  		ns.Emoji = cnp
    64  		ns.Enum = Success
    65  		ns.BigInt = bigInt
    66  		ns.Date = civil.DateOf(now)
    67  		ns.DateTime = now
    68  		ns.CreatedAt = now
    69  		ns.UpdatedAt = now
    70  		err = table.ModifyOne(
    71  			ctx,
    72  			&ns,
    73  			options.ModifyOne().SetDebug(true))
    74  		require.NoError(t, err)
    75  
    76  		err = table.ModifyOne(
    77  			ctx,
    78  			&ns,
    79  			options.ModifyOne().SetDebug(true))
    80  		require.Error(t, err)
    81  
    82  		err = table.ModifyOne(
    83  			ctx,
    84  			&ns,
    85  			options.ModifyOne().
    86  				SetStrict(false).
    87  				SetDebug(true))
    88  		require.NoError(t, err)
    89  
    90  		ns2 := normalStruct{}
    91  		err = table.FindOne(
    92  			ctx,
    93  			actions.FindOne().
    94  				Where(
    95  					expr.Equal("$Key", ns.ID),
    96  				),
    97  		).Decode(&ns2)
    98  		require.NoError(t, err)
    99  		require.Equal(t, cnp, ns2.Emoji)
   100  		require.Equal(t, Success, ns2.Enum)
   101  		require.Equal(t, bigInt, ns2.BigInt)
   102  		require.NotZero(t, ns2.DateTime)
   103  		require.NotZero(t, ns2.CreatedAt)
   104  		require.NotZero(t, ns2.UpdatedAt)
   105  		require.Nil(t, ns2.Location)
   106  	}
   107  
   108  	{
   109  		// ModifyOne with custom primary key
   110  		type newStruct struct {
   111  			Key     int64 `sqlike:"$Key"`
   112  			No      int64
   113  			Message string
   114  			Flag    bool
   115  			ID      int64 `sqlike:",primary_key"`
   116  		}
   117  
   118  		tbl := db.Table("NewStruct")
   119  
   120  		tbl.MustMigrate(ctx, newStruct{})
   121  		err = tbl.Truncate(ctx)
   122  		require.NoError(t, err)
   123  
   124  		ns := newStruct{}
   125  		ns.Key = 8888
   126  		ns.No = 1500
   127  		ns.ID = 1
   128  		result, err = tbl.InsertOne(
   129  			ctx,
   130  			&ns,
   131  			options.InsertOne().
   132  				SetMode(options.InsertIgnore))
   133  		affected, _ = result.RowsAffected()
   134  		require.NoError(t, err)
   135  		require.Equal(t, int64(1), affected)
   136  
   137  		ns.Key = 6767
   138  		ns.Message = "hello world"
   139  		ns.Flag = true
   140  		ns.No = 1800
   141  		err = tbl.ModifyOne(
   142  			ctx,
   143  			&ns,
   144  			options.ModifyOne().SetDebug(true),
   145  		)
   146  		require.NoError(t, err)
   147  
   148  		ns2 := newStruct{}
   149  		err = tbl.FindOne(
   150  			ctx,
   151  			actions.FindOne().
   152  				Where(
   153  					expr.Equal("ID", 1),
   154  				),
   155  		).Decode(&ns2)
   156  		require.NoError(t, err)
   157  		require.Equal(t, int64(6767), ns2.Key)
   158  		require.Equal(t, int64(1800), ns2.No)
   159  		require.Equal(t, "hello world", ns2.Message)
   160  		require.Equal(t, true, ns2.Flag)
   161  	}
   162  
   163  	// Update single record
   164  	{
   165  		affected, err = table.UpdateOne(
   166  			ctx,
   167  			actions.UpdateOne().
   168  				Where(expr.Equal("$Key", uid)).
   169  				Set(
   170  					expr.ColumnValue("LongStr", "1234abcd"),
   171  					expr.ColumnValue("Emoji", "<😗>"),
   172  				),
   173  			options.UpdateOne().SetDebug(true),
   174  		)
   175  
   176  		require.NoError(t, err)
   177  		require.Equal(t, int64(1), affected)
   178  	}
   179  
   180  	// Advance update query
   181  	{
   182  		/*
   183  			UPDATE `sqlike`.`NormalStruct`
   184  			SET
   185  				`Emoji` = "<😗>",
   186  				`SID` = `LongStr`,
   187  				`Int` = `Int` + 100,
   188  				`Tinyint` = 80
   189  			WHERE `$Key` = "be72fc34-917b-11e9-af91-6c96cfd87b17"
   190  			LIMIT 1;
   191  		*/
   192  		affected, err = table.UpdateOne(
   193  			ctx,
   194  			actions.UpdateOne().
   195  				Where(
   196  					expr.Equal("$Key", uid),
   197  				).
   198  				Set(
   199  					expr.ColumnValue("Emoji", "<😗>"),
   200  					expr.ColumnValue("SID", expr.Column("LongStr")),
   201  					expr.ColumnValue("Int", expr.Increment("Int", 100)),
   202  					expr.ColumnValue("Tinyint", expr.Raw("80")),
   203  				),
   204  			options.UpdateOne().SetDebug(true),
   205  		)
   206  
   207  		require.NoError(t, err)
   208  		require.Equal(t, int64(1), affected)
   209  	}
   210  
   211  	// update with case
   212  	{
   213  		/*
   214  			UPDATE `sqlike`.`NormalStruct` SET `SID` = (
   215  				CASE
   216  					WHEN (`$Key` = "be72fc34-917b-11e9-af91-6c96cfd87b17" AND `$Key` IS NOT NULL) THEN 88
   217  					WHEN `$Key` = "ae608554-491c-4472-beac-97feef49e810" THEN 56789
   218  					ELSE 100
   219  				END
   220  			)
   221  			WHERE `$Key` IN (
   222  				"be72fc34-917b-11e9-af91-6c96cfd87b17",
   223  				"ae608554-491c-4472-beac-97feef49e810"
   224  			);
   225  		*/
   226  
   227  		uids := []uuid.UUID{uid, uid2}
   228  		i8 := int8(88)
   229  		i32 := int32(100)
   230  		i64 := int64(56789)
   231  		affected, err = table.Update(
   232  			ctx,
   233  			actions.Update().
   234  				Where(expr.In("$Key", uids)).
   235  				Set(
   236  					expr.ColumnValue(
   237  						"SID",
   238  						expr.Case().
   239  							When(
   240  								expr.And(
   241  									expr.Equal("$Key", uid),
   242  									expr.NotNull("$Key"),
   243  								),
   244  								i8,
   245  							).
   246  							When(
   247  								expr.Equal("$Key", uid2),
   248  								i64,
   249  							).
   250  							Else(i32),
   251  					),
   252  				),
   253  			options.Update().SetDebug(true),
   254  		)
   255  
   256  		require.NoError(t, err)
   257  		require.Equal(t, int64(2), affected)
   258  
   259  		var result1 normalStruct
   260  		err := table.FindOne(
   261  			ctx,
   262  			actions.FindOne().
   263  				Where(
   264  					expr.Equal("$Key", uid),
   265  				),
   266  		).Decode(&result1)
   267  		require.NoError(t, err)
   268  
   269  		require.Equal(t, "88", result1.SID)
   270  
   271  		var result2 normalStruct
   272  		err = table.FindOne(
   273  			ctx,
   274  			actions.FindOne().
   275  				Where(
   276  					expr.Equal("$Key", uid2),
   277  				),
   278  		).Decode(&result2)
   279  		require.NoError(t, err)
   280  
   281  		require.Equal(t, "56789", result2.SID)
   282  	}
   283  
   284  }
   285  
   286  // UpdateErrorExamples :
   287  func UpdateErrorExamples(ctx context.Context, t *testing.T, db *sqlike.Database) {
   288  	var (
   289  		ns  normalStruct
   290  		err error
   291  	)
   292  
   293  	table := db.Table("NormalStruct")
   294  
   295  	{
   296  		err = table.ModifyOne(ctx, nil)
   297  		require.Error(t, err)
   298  
   299  		err = table.ModifyOne(ctx, &struct{}{})
   300  		require.Error(t, err)
   301  
   302  		err = table.ModifyOne(ctx, &ns)
   303  		require.Equal(t, sqlike.ErrNoRecordAffected, err)
   304  	}
   305  }