@@ -77,20 +77,34 @@ Models are JSON files in the `models/` directory:
7777
7878| Type | PostgreSQL | Use Cases |
7979| ------| ------------| -----------|
80- | ` "Integer" ` | INTEGER | IDs, counters |
81- | ` "BigInt" ` | BIGINT | Large numbers |
82- | ` "Text" ` | TEXT | Strings |
83- | ` "Boolean" ` | BOOLEAN | Flags |
84- | ` "Timestamp" ` | TIMESTAMP | Date/time |
80+ | ` "small_int" ` | SMALLINT | Small integers (-32768 to 32767) |
81+ | ` "integer" ` | INTEGER | IDs, counters |
82+ | ` "big_int" ` | BIGINT | Large numbers |
83+ | ` "real" ` | REAL | Single precision float |
84+ | ` "double_precision" ` | DOUBLE PRECISION | Double precision float |
85+ | ` "text" ` | TEXT | Strings |
86+ | ` "boolean" ` | BOOLEAN | Flags |
87+ | ` "date" ` | DATE | Date only |
88+ | ` "time" ` | TIME | Time only |
89+ | ` "timestamp" ` | TIMESTAMP | Date/time without timezone |
90+ | ` "timestamptz" ` | TIMESTAMPTZ | Date/time with timezone |
91+ | ` "bytea" ` | BYTEA | Binary data |
92+ | ` "uuid" ` | UUID | UUIDs |
93+ | ` "json" ` | JSON | JSON data |
94+ | ` "jsonb" ` | JSONB | Binary JSON (indexable) |
95+ | ` "inet" ` | INET | IPv4/IPv6 address |
96+ | ` "cidr" ` | CIDR | Network address |
97+ | ` "macaddr" ` | MACADDR | MAC address |
8598
8699### Custom Types
87100
101+ For types not covered above:
102+
88103``` json
89- { "Custom" : " UUID" }
90- { "Custom" : " JSONB" }
91- { "Custom" : " DECIMAL(10,2)" }
92- { "Custom" : " VARCHAR(255)" }
93- { "Custom" : " TIMESTAMPTZ" }
104+ { "custom" : " DECIMAL(10,2)" }
105+ { "custom" : " VARCHAR(255)" }
106+ { "custom" : " NUMERIC(20,8)" }
107+ { "custom" : " INTERVAL" }
94108```
95109
96110## Inline Constraints
@@ -100,7 +114,7 @@ Models are JSON files in the `models/` directory:
100114``` json
101115{
102116 "name" : " id" ,
103- "type" : " Integer " ,
117+ "type" : " integer " ,
104118 "nullable" : false ,
105119 "primary_key" : true
106120}
@@ -109,33 +123,33 @@ Models are JSON files in the `models/` directory:
109123### Unique
110124
111125``` json
112- { "name" : " email" , "type" : " Text " , "nullable" : false , "unique" : true }
126+ { "name" : " email" , "type" : " text " , "nullable" : false , "unique" : true }
113127```
114128
115129Named or composite unique:
116130``` json
117- { "name" : " tenant_id" , "type" : " Integer " , "nullable" : false , "unique" : [" uq_tenant_user" ] },
118- { "name" : " username" , "type" : " Text " , "nullable" : false , "unique" : [" uq_tenant_user" ] }
131+ { "name" : " tenant_id" , "type" : " integer " , "nullable" : false , "unique" : [" uq_tenant_user" ] },
132+ { "name" : " username" , "type" : " text " , "nullable" : false , "unique" : [" uq_tenant_user" ] }
119133```
120134
121135### Index
122136
123137``` json
124- { "name" : " email" , "type" : " Text " , "nullable" : false , "index" : true }
138+ { "name" : " email" , "type" : " text " , "nullable" : false , "index" : true }
125139```
126140
127141Composite index:
128142``` json
129- { "name" : " user_id" , "type" : " Integer " , "nullable" : false , "index" : [" idx_user_date" ] },
130- { "name" : " created_at" , "type" : " Timestamp " , "nullable" : false , "index" : [" idx_user_date" ] }
143+ { "name" : " user_id" , "type" : " integer " , "nullable" : false , "index" : [" idx_user_date" ] },
144+ { "name" : " created_at" , "type" : " timestamp " , "nullable" : false , "index" : [" idx_user_date" ] }
131145```
132146
133147### Foreign Key
134148
135149``` json
136150{
137151 "name" : " user_id" ,
138- "type" : " Integer " ,
152+ "type" : " integer " ,
139153 "nullable" : false ,
140154 "foreign_key" : {
141155 "ref_table" : " user" ,
@@ -178,10 +192,10 @@ Reference actions: `"Cascade"`, `"Restrict"`, `"SetNull"`, `"SetDefault"`, `"NoA
178192 "$schema" : " https://raw.githubusercontent.com/dev-five-git/vespertide/refs/heads/main/schemas/model.schema.json" ,
179193 "name" : " user" ,
180194 "columns" : [
181- { "name" : " id" , "type" : " Integer " , "nullable" : false , "primary_key" : true },
182- { "name" : " email" , "type" : " Text " , "nullable" : false , "unique" : true , "index" : true },
183- { "name" : " name" , "type" : " Text " , "nullable" : false },
184- { "name" : " created_at" , "type" : " Timestamp " , "nullable" : false , "default" : " NOW()" }
195+ { "name" : " id" , "type" : " integer " , "nullable" : false , "primary_key" : true },
196+ { "name" : " email" , "type" : " text " , "nullable" : false , "unique" : true , "index" : true },
197+ { "name" : " name" , "type" : " text " , "nullable" : false },
198+ { "name" : " created_at" , "type" : " timestamptz " , "nullable" : false , "default" : " NOW()" }
185199 ],
186200 "constraints" : [],
187201 "indexes" : []
@@ -195,12 +209,12 @@ Reference actions: `"Cascade"`, `"Restrict"`, `"SetNull"`, `"SetDefault"`, `"NoA
195209 "$schema" : " https://raw.githubusercontent.com/dev-five-git/vespertide/refs/heads/main/schemas/model.schema.json" ,
196210 "name" : " post" ,
197211 "columns" : [
198- { "name" : " id" , "type" : " Integer " , "nullable" : false , "primary_key" : true },
199- { "name" : " user_id" , "type" : " Integer " , "nullable" : false , "foreign_key" : { "ref_table" : " user" , "ref_columns" : [" id" ], "on_delete" : " Cascade" }, "index" : true },
200- { "name" : " title" , "type" : " Text " , "nullable" : false },
201- { "name" : " content" , "type" : " Text " , "nullable" : false },
202- { "name" : " published" , "type" : " Boolean " , "nullable" : false , "default" : " false" },
203- { "name" : " created_at" , "type" : " Timestamp " , "nullable" : false , "default" : " NOW()" }
212+ { "name" : " id" , "type" : " integer " , "nullable" : false , "primary_key" : true },
213+ { "name" : " user_id" , "type" : " integer " , "nullable" : false , "foreign_key" : { "ref_table" : " user" , "ref_columns" : [" id" ], "on_delete" : " Cascade" }, "index" : true },
214+ { "name" : " title" , "type" : " text " , "nullable" : false },
215+ { "name" : " content" , "type" : " text " , "nullable" : false },
216+ { "name" : " published" , "type" : " boolean " , "nullable" : false , "default" : " false" },
217+ { "name" : " created_at" , "type" : " timestamptz " , "nullable" : false , "default" : " NOW()" }
204218 ],
205219 "constraints" : [],
206220 "indexes" : []
@@ -214,12 +228,12 @@ Reference actions: `"Cascade"`, `"Restrict"`, `"SetNull"`, `"SetDefault"`, `"NoA
214228 "$schema" : " https://raw.githubusercontent.com/dev-five-git/vespertide/refs/heads/main/schemas/model.schema.json" ,
215229 "name" : " order" ,
216230 "columns" : [
217- { "name" : " id" , "type" : { "Custom" : " UUID " } , "nullable" : false , "primary_key" : true , "default" : " gen_random_uuid()" },
218- { "name" : " customer_id" , "type" : " Integer " , "nullable" : false , "foreign_key" : { "ref_table" : " customer" , "ref_columns" : [" id" ], "on_delete" : " Restrict" }, "index" : true },
219- { "name" : " total_amount" , "type" : { "Custom " : " DECIMAL(10,2)" }, "nullable" : false },
220- { "name" : " status" , "type" : " Text " , "nullable" : false , "default" : " 'pending'" },
221- { "name" : " metadata" , "type" : { "Custom" : " JSONB " } , "nullable" : true },
222- { "name" : " created_at" , "type" : " Timestamp " , "nullable" : false , "default" : " NOW()" }
231+ { "name" : " id" , "type" : " uuid " , "nullable" : false , "primary_key" : true , "default" : " gen_random_uuid()" },
232+ { "name" : " customer_id" , "type" : " integer " , "nullable" : false , "foreign_key" : { "ref_table" : " customer" , "ref_columns" : [" id" ], "on_delete" : " Restrict" }, "index" : true },
233+ { "name" : " total_amount" , "type" : { "custom " : " DECIMAL(10,2)" }, "nullable" : false },
234+ { "name" : " status" , "type" : " text " , "nullable" : false , "default" : " 'pending'" },
235+ { "name" : " metadata" , "type" : " jsonb " , "nullable" : true },
236+ { "name" : " created_at" , "type" : " timestamptz " , "nullable" : false , "default" : " NOW()" }
223237 ],
224238 "constraints" : [
225239 { "type" : " check" , "name" : " check_total_positive" , "expr" : " total_amount >= 0" }
@@ -235,9 +249,9 @@ Reference actions: `"Cascade"`, `"Restrict"`, `"SetNull"`, `"SetDefault"`, `"NoA
235249 "$schema" : " https://raw.githubusercontent.com/dev-five-git/vespertide/refs/heads/main/schemas/model.schema.json" ,
236250 "name" : " user_role" ,
237251 "columns" : [
238- { "name" : " user_id" , "type" : " Integer " , "nullable" : false , "primary_key" : true , "foreign_key" : { "ref_table" : " user" , "ref_columns" : [" id" ], "on_delete" : " Cascade" } },
239- { "name" : " role_id" , "type" : " Integer " , "nullable" : false , "primary_key" : true , "foreign_key" : { "ref_table" : " role" , "ref_columns" : [" id" ], "on_delete" : " Cascade" } },
240- { "name" : " assigned_at" , "type" : " Timestamp " , "nullable" : false , "default" : " NOW()" }
252+ { "name" : " user_id" , "type" : " integer " , "nullable" : false , "primary_key" : true , "foreign_key" : { "ref_table" : " user" , "ref_columns" : [" id" ], "on_delete" : " Cascade" } },
253+ { "name" : " role_id" , "type" : " integer " , "nullable" : false , "primary_key" : true , "foreign_key" : { "ref_table" : " role" , "ref_columns" : [" id" ], "on_delete" : " Cascade" } },
254+ { "name" : " assigned_at" , "type" : " timestamptz " , "nullable" : false , "default" : " NOW()" }
241255 ],
242256 "constraints" : [],
243257 "indexes" : [
0 commit comments