# README
dyc
dyc
is a golang package which provides a dynamodb client and query builder. It utilizes the go AWS SDK to provide a more convenient way to interact with dynamodb.
Features
- Utilize current dynamodb query language
- Easily reference columns that conflict with dynamodb reserved words by wrapping column in a single quote
- Build queries with ease
- Input substitution via
?
- Parallel Scan support
- Copy table support
- In Support
- Basic Conjunctions support
Examples
Client setup
// setup aws session
awsSession := session.Must(session.NewSession(aws.NewConfig()))
// setup aws dynamodb sdk client
db := dynamodb.New(awsSession)
// setup the dyc client
cli := dyc.NewClient(db)
Query
Iterator
// error ignored for demonstration purposes only
it, err := li.Builder().Table("MyTable").
WhereKey(`PK = ?`, "PartitionKey").
Index("SomeIndex").
// Where is equivalent to filter expression
Where(`'Some'.'Nested'.'Field' = ? AND 'another' = ?`, "cool", true).
ToQueryIterator(ctx)
var results []map[string]dynamodb.AttributeValue
for it.Next() {
// error ignored for demonstration purposes only
output, _ := it.QueryValue(), it.Err()
results = append(results, output.Items...)
}
Iterate
err := cli.Builder().Table("MyTable").
WhereKey(`PK = ?`, "PartitionKey").
Index("SomeIndex").
// Where is equivalent to filter expression
Where(`'Some'.'Nested'.'Field' = ? AND 'another' = ?`, "cool", true).
QueryIterate(ctx, func(output *dynamodb.QueryOutput) error {
// get results
return nil
})
Query All
type Row struct {
PK string
SK string
Some map[string]interface
}
var rows []Row
// results will be an array of dynamodb attribute maps
results, err := cli.Builder().Table("MyTable").
// WhereKey is equivalent to query expression
WhereKey(`PK = ?`, "PartitionKey").
// Result Unmarshals the raw results into the custom type
Result(&rows).
Index("SomeIndex").
Where(`'Some'.'Nested'.'Field' = ? AND 'another' = ?`, "cool", true).
QueryAll(ctx context.Context)
Query Single
type Row struct {
PK string
SK string
Some map[string]interface
}
var row Row
//result will be a dynamodb attribute map
result, err := cli.Builder().Table("MyTable").
WhereKey(`PK = ?`, "PartitionKey").
// Result Unmarshals the raw results into the custom type
Result(&row).
Index("SomeIndex").
Where(`'Some'.'Nested'.'Field' = ? AND 'another' = ?`, "cool", true).
QuerySingle(ctx context.Context)
Delete By Query
err := cli.Builder().Table("MyTable").
WhereKey("PK = ? AND SK BETWEEN ? AND ?", "key", 1, 1337)
Where(`'Some'.'Nested'.'Field' = ? AND 'another' = ?`, "cool", true).
QueryDelete(ctx)
- deletes all records matching the query
Insert Item
type Row struct {
PK string
SK string
StrMap map[string]string
}
row := Row{PK: "yo", SK: "lo", StrMap: map[string]string{"who": "goes there"}}
result, err := cli.Builder().Table("MyTable").
PutItem(context.Background(), row)
Insert Item Conditionally
type Row struct {
PK string
SK string
StrMap map[string]string
}
row := Row{PK: "yo", SK: "lo", StrMap: map[string]string{"who": "goes there"}}
result, err := cli.Builder().Table("MyTable").
Condition("attribute_not_exists(PK)").
PutItem(context.Background(), row)
Update Item
result, err := cli.Builder().Table("MyTable").
Key("PK", "yo", "SK", "lo").
Update(`REMOVE 'StrMap'.'who' SET 'StrMap'.'goes' = ?`, "who there").
UpdateItem(context.Background())
Scan
Iterator
// error ignored for demonstration purposes only
it, err := li.Builder().Table("MyTable").
WhereKey(`PK = ?`, "PartitionKey").
Index("SomeIndex").
// Where is equivalent to filter expression
Where(`'Some'.'Nested'.'Field' = ? AND 'another' = ?`, "cool", true).
ToScanIterator(ctx)
var results []map[string]dynamodb.AttributeValue
for it.Next() {
// error ignored for demonstration purposes only
output, _ := it.ScanValue(), it.Err()
results = append(results, output.Items...)
}
Iterate
err := cli.Builder().Table("MyTable").
Where(`'Some'.'Nested'.'Field' = ? AND 'another' = ?`, "cool", true).
ScanIterate(ctx, func(output *dynamodb.ScanOutput) error {
// get results
return nil
})
In
err := cli.Builder().Table("MyTable").
IN(`'Some'.'Nested'.'Field'`, "value1", "value2").
ScanIterate(ctx, func(output *dynamodb.ScanOutput) error {
// get results
return nil
})
InSlice
err := cli.Builder().Table("MyTable").
IN(`'Some'.'Nested'.'Field'`, []string{"value1", "value2"}).
ScanIterate(ctx, func(output *dynamodb.ScanOutput) error {
// get results
return nil
})
Conjunctions Example
results, err := cli.Builder().
Table("MyTable").
Select(`PK`, "DAT", "SOME.NESTED.FIELD").
WhereKey("PK = ?", "some key").
Where(`'SOMEVALUE'.here = ?`, true).
OrWhere(`'SOMEOTHER'.'VALUE' = ?`, false).
OrIN("field1", 23, 432, 200, 23).
InSlice("field2", []string{"one", "two", "three"})
Condition("attribute_not_exists(YO.'id')").
OrCondition("attribute_exists(YOLO)").
IN(`'Some'.'Nested'.'Field'`, []string{"value1", "value2"}).
QueryAll(context.TODO())
Scan Delete
err := cli.Builder().Table("MyTable").
Where(`'Some'.'Nested'.'Field' = ? AND 'another' = ?`, "cool", true).
ScanDelete(ctx)
- deletes all records matching the scan
- PK and SK are the partition key and sort key needed to delete the matching records
Copy table example
totalWorkers := 40
err := cli.CopyTable(ctx, "destinationTable", "sourceTable", totalWorkers, nil)
# Functions
FieldsExtractor extracts the provided fields.
Int converts an integer into a integer type.
IntList converts an array of integers to an integer list type.
NewBuilder creates a new builder.
NewClient creates a new dyc client.
NewIteratorFromQuery creates a new iterator from a query.
NewIteratorFromScan creates a new iterator from a scan.
PKSKExtractor extracts the fields PK and SK.
String converts a string to a string type.
StringList converts an array of strings to a string list type.
StringSet converts an array of strings to a string set type.
# Variables
ErrBadKeyParams occurs if k/v params don't line up.
ErrBadKeyType occurs if you try to provide a non string key name.
ErrClientNotSet occurs if you try to make a client call from a builder without setting the client.
ErrKeyRequired occurs if key is required for the given operation.
ErrNotPointer occurs if a non pointer type is provided to the Result method of the builder type.
ErrNotSlice occurs if a non slice type is provided as a value for any of the IN builder query functions.
ErrQueryMisMatch occurs if the number of ? don't line up with the given inputs for a query.
ErrUnsupportedType occurs if you are trying to add an unsupported type as an input for a query.
# Interfaces
IteratorClient is an interface for all methods utilized by iterator.
# Type aliases
KeyExtractor is a type primarily used to get necessary fields needed to delete a record.
No description provided by the author
No description provided by the author