https://github.com/lestrrat-go/spanner-model
https://github.com/lestrrat-go/spanner-model
Last synced: 4 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/lestrrat-go/spanner-model
- Owner: lestrrat-go
- License: mit
- Created: 2022-12-21T01:33:39.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2022-12-21T08:06:44.000Z (over 2 years ago)
- Last Synced: 2025-01-09T03:41:41.591Z (6 months ago)
- Language: Go
- Size: 6.84 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# DESCRIPTION
Suppose you have some objects that represent a Spanner table, perhaps
a protobuf message.```go
type Example struct {
Foo string `protobuf:"string,1,opt,name=foo,proto3" json:"foo,omitempty"
Bar string `protobuf:"string,2,opt,name=bar,proto3" json:"bar,omitempty"
Baz string `protobuf:"string,2,opt,name=baz,proto3" json:"baz,omitempty"
}
```But perhaps this message does not _exactly_ represent a Spanner table:
for example, you might have some extra columns in the Spanner table, or
maybe some column types do not exactly translate to/from the protobuf
message definition.But it still would be nice to keep the protobuf message as its single
source of truth. Perhaps you would like generate some intermediate object
to handle the translation between the protobuf object and the Spanner
table. Perhaps you would like to generate the Spanner DDL to create the
Spanner table from code.You can use this package along with the format package to embed Spanner
specific metadata into existing objects, as well as use them to generate
Spanner DDLs.# SYNOPSIS
To enable generating Spanner DDL for the example above, create another
file alongside the generated `*.pb.go` file:```go
func (Example) Name() string {
return `ExampleTable`
}func (Example) Columns() []format.Column {
return []format.Column{
model.StringColumn(`Foo`, 1024),
model.StringColumn(`Bar`, 1024),
model.StringColumn(`Baz`, 1024),
}
}func (Example) PrimaryKey() *model.PrimaryKeySpec {
return &model.PrimaryKeySpec{
Columns: []string{
model.NewPrimaryKeyColumn(`Foo`, 1024),
model.NewPrimaryKeyColumn(`Bar`, 1024),
model.NewPrimaryKeyColumn(`Baz`, 1024),
},
}
}
```Feed the struct into `format.Format()` and you will end up with a DDL:
```go
var buf bytes.Buffer
format.Format(&buf, Example{})// CREATE TABLE `Example` (
// Foo STRING(1024),
// Bar STRING(1024),
// Baz STRING(1024)
// ) PRIMARY KEY (`Foo`, `Bar`, `Baz`)
```