- 首先支持 DynamoDB,按DynamoDB的习惯来操作。
- 后续支持 MongoDB
import (
"git.devops.com/go/odm"
_ "git.devops.com/go/odm/dynamo"
)
db,err := odm.Open("dynamodb", "AccessKey=123;SecretKey=456;Token=789;Region=localhost;Endpoint=http://127.0.0.1:8000")
db.Close()
db,err := odm.Open("mysql", "db_user:password@tcp(localhost:3306)/my_db")
NOTE: 业务层在使用时不需要关心连接池
也可以使用AWS的底层配置对象来实现
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
)
...
creds := credentials.NewStaticCredentials("123", "123", "")
db, err := dynamo.OpenDB(&aws.Config{
Credentials: creds,
Endpoint: aws.String(END_POINT),
Region: aws.String("localhost"),
})
TODO 根据Model定义生成表 对表的创建、建立索引由运维手动完成。暂不由代码控制。
Table 用于抽象数据表的操作,对应Dynamo的Table,MongoDB的Collection,MySQL的Table。操作以Dynamo为基础进行设计。
有两种方式获得Table。 db.Table("table_name")
这种方式只能获取已经存在于数据库中的表。db.Table(&Book{})
这种方式可以获得Book对应的表,如果表不存在则会在localhost测试环境自动创建(生产环境仍要运维创建)。为了能够获得创建表的必要信息,我们需要对Table增加注解。
type Book struct {
Author string `odm:"PK"` // odm:"PK" 注解标记主键
Title string `odm:"SK"` // odm:"SK" 注解标记排序
Age int64
// 自定义数据库字段
JSONInfo string `json:"json_info"`
DyTagInfo string `json:"dyInfo" dynamodbav:"dy_info"`
}
type Map map[string]interface{}
可以使用来方便的创建一个Map
odm.Map{
"Author": "Tom",
"Title": "Hello world",
}
type Model interface{}
仅仅是一个指针,可以是任何结构体。
为了方便操作,简化了一些AWS SDK的字段名。
- NameParams 对应 ExpressionAttributeNames
- ValueParams 对应 ExpressionAttributeValues
- Filter 对应 ConditionExpression
- Select 对应 ProjectionExpression
- KeyFilter 对应 KeyConditionExpression
type WriteOption struct {
ConditionExpression *string
NameParams
ValueParams
}
Condition 类型是一个条件表达式,仅当表达式成立时,操作才能成功。
PutItem 操作。替换整个item。
UpdateItem(pk interface{}, sk interface{}, updateExpression string, opt WriteOption, item Model) error
Update 部分字段,根据ReturnValues返回数据到item中。
Consistent 代表是否是一致性读。
被删除对象将填充到item。
查询列表。 startKey 用来作性能优化。查询将从startKey开始。查询完成后,startKey将被更新。
type QueryOption struct {
// 查询表达式
Filter string
KeyFilter string
Select string
// 查询参数
NameParams map[string]string
ValueParams Map
// 查询限制
Consistent bool
Limit int64
IndexName string
Desc bool // 默认升序,默认false。向其他数据库迁移的时候,这里需要注意,可能不兼容,需要提供额外的排序信息。
}
TODO 暂不支持Scan, 与Query使用同一方法。
TODO 使用Redis实现类似Table的功能。只能支持一些简单的查询。接口形式为Table
TODO 组合Cache(RedisCache、MemoryCache、MixCache)和Table(DynamoTable、MongoTable)的一个实现,接口形式为Table。对PutItem、UpdateItem、DeleteItem、GetItem
Cache接口封装缓存常规操作。包含 GetItem、PutItem、DeleteItem
RedisCache、MemoryCache、MixCache(级联 MemoryCache 和 RedisCache)
go test ./...