Skip to main content

Columns

Almost every entity has some columns storing its data.

You define a column by adding a property to an entity.

export class Post {
title = def.stringColumn().notNull();
publishedAt = def.dateTimeColumn();
}

Except its name, each column has a type definition. Additionally you may define some flags, like nullability.

Supported data types

Contember TypeDefinition methodPostgreSQL typeDescription
StringstringColumntextGeneric text field with arbitrary length.
IntintColumnintegerStores whole signed numbers (32b default)
DoubledoubleColumndouble precisionFloating point numbers according to IEEE 64-bit float.
BoolboolColumnbooleanBinary true/false value.
DateTimedateTimeColumntimestamptzFor storing date and time, converted to UTC by default and transferred in ISO 8601 format (e.g. 2032-01-18T13:36:45Z).
DatedateColumndateDate field without a time part. It's transferred in YYYY-MM-DD format (e.g. 2032-01-18).
JsonjsonColumnjsonbStores arbitrary JSON.
UUIDuuidColumnuuidUniversally unique identifier, used for all primary keys by default.
EnumenumColumncustom domainField with predefined set of possible values. See more in a section below.
note

The type of column in PostgreSQL database can be changed using .columnType(...) in schema definition.

Example: changing database type of Json column

export class Post {
config = def.jsonColumn().columnType('json')
}

Unique fields

You can mark a column unique by calling .unique() method on it.

slug = def.stringColumn().unique();

If you need composite unique key, use a class decorator:

@def.Unique("locale", "slug")
export class Post {
slug = def.stringColumn().notNull();
locale = def.stringColumn().notNull();
}
tip

You can also reference relationships in Unique.

You can then use these unique combinations to fetch a single record. "One has one" relationships are marked as unique by default.

Enums

  • If you need to limit a set of allowed values for a column, you can do it using enums.
  • Enum column types are mapped to GraphQL enums.
  • In PostgreSQL enums are represented as custom domain type.

Use case

Let's say you want to add a state to the Post definition - it can be either a "draft", "for review" or "published".

First define an enum

export const PostEnum = def.createEnum("draft", "for_review", "published");

And now we can reference it from Post entity

export class Post {
state = def.enumColumn(PostEnum);
}

Further, we can use not-null constraint and set default value which will be used when Post is created without state specified

export class Post {
state = def.enumColumn(PostEnum).notNull().default("draft");
}