Like generators, data models have a schema.
They capture the fields, relations, and other information
needed to generate types, database tables, and much more.
hof/dm.#Datamodel Schema
hof’s core #Datamodel schema is intentionally minimal.
It defines a hierarchy from Datamodel > Model > Fields & Relations.
The schema is sparce and open, having just what is needed
for hof dm to checkpoint and introspect data models.
The following as the core of the #Datamodel schema.
Core of #Datamodel
packagedm#Datamodel: { @datamodel() Name: string// Models in the data model, ordered Models: #Models OrderedModels: [ for M in Models {M}] ...}#Models: [name=string]: #Model & {Name: name, ...}#Model: { @dm_model() Name: string Fields: #Fields OrderedFields: [ for F in Fields {F}] Relations?: #Relations ...}#Fields: [name=string]: #Field & {Name: name, ...}#Field: { @dm_field() Name: string Type: string ...}#Relations: [name=string]: #Relation & {Name: name, ...}#Relation: { @dm_relation() Name: string// Relation to another thing// This is the relation type Reln: "BelongsTo"|"HasOne"|"HasMany"|"ManyToMany"// This is the other type or side of the relation (a Model) Type: string ...}
hof’s core #Datamodel schema is intended to be extended.
Since we will be using a Go map for a simple data store,
we will add a CUE field to #Model to track which
field to use for the index in our types.
We add a new file in our schema directory
example/schema/dm.cue
packageschemaimport ("github.com/hofstadter-io/hof/schema/dm")#Datamodel: dm.#Datamodel & { Models: [string]: #Model OrderedModels: [ for M in Models {M}]}#Model: dm.#Model & {// field used for indexing Index: string}
We now have an extended schema we can import to define our data models.