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

     1  package examples
     2  
     3  import (
     4  	"context"
     5  	"database/sql"
     6  	"testing"
     7  
     8  	"github.com/RevenueMonster/sqlike/sql/expr"
     9  	"github.com/RevenueMonster/sqlike/sqlike"
    10  	"github.com/RevenueMonster/sqlike/sqlike/actions"
    11  	"github.com/RevenueMonster/sqlike/sqlike/options"
    12  	uuid "github.com/google/uuid"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  // DeleteExamples :
    17  func DeleteExamples(ctx context.Context, t *testing.T, db *sqlike.Database) {
    18  	var (
    19  		affected int64
    20  		result   sql.Result
    21  		ns       normalStruct
    22  		err      error
    23  	)
    24  
    25  	table := db.Table("NormalStruct")
    26  
    27  	// Delete record with primary key
    28  	{
    29  		err = table.FindOne(
    30  			ctx,
    31  			actions.FindOne().
    32  				OrderBy(expr.Desc("$Key")),
    33  		).Decode(&ns)
    34  		require.NoError(t, err)
    35  		err = table.DestroyOne(ctx, &ns)
    36  		require.NoError(t, err)
    37  	}
    38  
    39  	// Delete record with primary key tag (DestroyOne)
    40  	{
    41  		type dummy struct {
    42  			UUID uuid.UUID `sqlike:",primary_key"`
    43  		}
    44  
    45  		table := db.Table("testDB")
    46  		err = table.DropIfExists(ctx)
    47  		require.NoError(t, err)
    48  
    49  		table.MustUnsafeMigrate(ctx, dummy{})
    50  		records := []dummy{
    51  			{UUID: uuid.New()},
    52  			{UUID: uuid.New()},
    53  		}
    54  
    55  		_, err = table.Insert(ctx, &records)
    56  		require.NoError(t, err)
    57  
    58  		// destroy with empty value should error
    59  		{
    60  			var nilDummy *dummy
    61  			err = table.DestroyOne(ctx, nilDummy)
    62  			require.Error(t, err)
    63  
    64  			err = table.DestroyOne(ctx, nil)
    65  			require.Error(t, err)
    66  		}
    67  
    68  		err = table.DestroyOne(
    69  			ctx,
    70  			records[0],
    71  			options.DestroyOne().SetDebug(true),
    72  		)
    73  		require.NoError(t, err)
    74  
    75  		err = table.DestroyOne(
    76  			ctx,
    77  			&records[1],
    78  			options.DestroyOne().SetDebug(true),
    79  		)
    80  		require.NoError(t, err)
    81  
    82  		var count uint
    83  		if err := table.FindOne(
    84  			ctx,
    85  			actions.FindOne().Select(expr.Count("UUID")),
    86  			options.FindOne().SetDebug(true),
    87  		).Scan(&count); err != nil {
    88  			require.NoError(t, err)
    89  		}
    90  		require.Equal(t, uint(0), count)
    91  	}
    92  
    93  	// Single delete
    94  	{
    95  		ns := newNormalStruct()
    96  		result, err = table.InsertOne(
    97  			ctx,
    98  			&ns,
    99  			options.InsertOne().SetDebug(true),
   100  		)
   101  		require.NoError(t, err)
   102  		affected, err = result.RowsAffected()
   103  		require.NoError(t, err)
   104  		require.Equal(t, int64(1), affected)
   105  		affected, err = table.DeleteOne(
   106  			ctx,
   107  			actions.DeleteOne().
   108  				Where(
   109  					expr.Equal("$Key", ns.ID),
   110  				),
   111  			options.DeleteOne().SetDebug(true),
   112  		)
   113  		require.NoError(t, err)
   114  		require.Equal(t, int64(1), affected)
   115  	}
   116  
   117  	// Multiple delete
   118  	{
   119  		nss := [...]normalStruct{
   120  			newNormalStruct(),
   121  			newNormalStruct(),
   122  			newNormalStruct(),
   123  		}
   124  		result, err = table.Insert(
   125  			ctx,
   126  			&nss,
   127  			options.Insert().
   128  				SetDebug(true),
   129  		)
   130  		require.NoError(t, err)
   131  		affected, err = result.RowsAffected()
   132  		require.NoError(t, err)
   133  		require.Equal(t, int64(3), affected)
   134  		affected, err = table.Delete(
   135  			ctx,
   136  			actions.Delete().
   137  				Where(
   138  					expr.In("$Key", []uuid.UUID{
   139  						nss[0].ID,
   140  						nss[1].ID,
   141  						nss[2].ID,
   142  					}),
   143  				), options.Delete().
   144  				SetDebug(true),
   145  		)
   146  		require.NoError(t, err)
   147  		require.Equal(t, int64(3), affected)
   148  	}
   149  }