Skip to content

Commit 4be8c42

Browse files
authored
Merge pull request #12 from dev-five-git/refactor-column-type
Refactor column type
2 parents 7819a2e + efdfc70 commit 4be8c42

File tree

27 files changed

+885
-418
lines changed

27 files changed

+885
-418
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"changes":{"crates/vespertide/Cargo.toml":"Patch","crates/vespertide-core/Cargo.toml":"Patch","crates/vespertide-planner/Cargo.toml":"Patch","crates/vespertide-cli/Cargo.toml":"Patch","crates/vespertide-query/Cargo.toml":"Patch","crates/vespertide-exporter/Cargo.toml":"Patch","crates/vespertide-macro/Cargo.toml":"Patch","crates/vespertide-config/Cargo.toml":"Patch"},"note":"Refactor column type","date":"2025-12-14T13:29:18.853713900Z"}

Cargo.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

SKILL.md

Lines changed: 51 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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

115129
Named 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

127141
Composite 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": [

crates/vespertide-cli/src/commands/diff.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ mod tests {
188188
use std::path::PathBuf;
189189
use tempfile::tempdir;
190190
use vespertide_config::VespertideConfig;
191-
use vespertide_core::{ColumnDef, ColumnType, TableDef};
191+
use vespertide_core::{ColumnDef, ColumnType, SimpleColumnType, TableDef};
192192

193193
struct CwdGuard {
194194
original: PathBuf,
@@ -221,7 +221,7 @@ mod tests {
221221
name: name.to_string(),
222222
columns: vec![ColumnDef {
223223
name: "id".into(),
224-
r#type: ColumnType::Integer,
224+
r#type: ColumnType::Simple(SimpleColumnType::Integer),
225225
nullable: false,
226226
default: None,
227227
comment: None,
@@ -251,7 +251,7 @@ mod tests {
251251
table: "users".into(),
252252
column: ColumnDef {
253253
name: "name".into(),
254-
r#type: ColumnType::Text,
254+
r#type: ColumnType::Simple(SimpleColumnType::Text),
255255
nullable: true,
256256
default: None,
257257
comment: None,
@@ -280,7 +280,7 @@ mod tests {
280280
MigrationAction::ModifyColumnType {
281281
table: "users".into(),
282282
column: "id".into(),
283-
new_type: ColumnType::Integer,
283+
new_type: ColumnType::Simple(SimpleColumnType::Integer),
284284
},
285285
format!("{} {}.{}", "Modify column type:".bright_yellow(), "users".bright_cyan(), "id".bright_cyan().bold())
286286
)]

crates/vespertide-cli/src/commands/export.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ mod tests {
156156
use serial_test::serial;
157157
use std::fs;
158158
use tempfile::tempdir;
159-
use vespertide_core::{ColumnDef, ColumnType, TableConstraint};
159+
use vespertide_core::{ColumnDef, ColumnType, SimpleColumnType, TableConstraint};
160160

161161
struct CwdGuard {
162162
original: PathBuf,
@@ -194,7 +194,7 @@ mod tests {
194194
name: name.to_string(),
195195
columns: vec![ColumnDef {
196196
name: "id".into(),
197-
r#type: ColumnType::Integer,
197+
r#type: ColumnType::Simple(SimpleColumnType::Integer),
198198
nullable: false,
199199
default: None,
200200
comment: None,

crates/vespertide-cli/src/commands/revision.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ mod tests {
124124
use std::{env, fs, path::PathBuf};
125125
use tempfile::tempdir;
126126
use vespertide_config::{FileFormat, VespertideConfig};
127-
use vespertide_core::{ColumnDef, ColumnType, TableDef};
127+
use vespertide_core::{ColumnDef, ColumnType, SimpleColumnType, TableDef};
128128

129129
struct CwdGuard {
130130
original: PathBuf,
@@ -165,7 +165,7 @@ mod tests {
165165
name: name.to_string(),
166166
columns: vec![ColumnDef {
167167
name: "id".into(),
168-
r#type: ColumnType::Integer,
168+
r#type: ColumnType::Simple(SimpleColumnType::Integer),
169169
nullable: false,
170170
default: None,
171171
comment: None,

crates/vespertide-cli/src/commands/sql.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ mod tests {
7979
use tempfile::tempdir;
8080
use vespertide_config::VespertideConfig;
8181
use vespertide_core::{
82-
ColumnDef, ColumnType, MigrationAction, MigrationPlan, TableConstraint, TableDef,
82+
ColumnDef, ColumnType, MigrationAction, MigrationPlan, SimpleColumnType, TableConstraint,
83+
TableDef,
8384
};
8485

8586
struct CwdGuard {
@@ -114,7 +115,7 @@ mod tests {
114115
name: name.to_string(),
115116
columns: vec![ColumnDef {
116117
name: "id".into(),
117-
r#type: ColumnType::Integer,
118+
r#type: ColumnType::Simple(SimpleColumnType::Integer),
118119
nullable: false,
119120
default: None,
120121
comment: None,
@@ -165,7 +166,7 @@ mod tests {
165166
table: "users".into(),
166167
columns: vec![ColumnDef {
167168
name: "id".into(),
168-
r#type: ColumnType::Integer,
169+
r#type: ColumnType::Simple(SimpleColumnType::Integer),
169170
nullable: false,
170171
default: None,
171172
comment: None,

crates/vespertide-cli/src/commands/status.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,9 @@ mod tests {
143143
use std::{fs, path::PathBuf};
144144
use tempfile::tempdir;
145145
use vespertide_config::VespertideConfig;
146-
use vespertide_core::{ColumnDef, ColumnType, MigrationAction, MigrationPlan, TableDef};
146+
use vespertide_core::{
147+
ColumnDef, ColumnType, MigrationAction, MigrationPlan, SimpleColumnType, TableDef,
148+
};
147149

148150
struct CwdGuard {
149151
original: PathBuf,
@@ -177,7 +179,7 @@ mod tests {
177179
name: name.to_string(),
178180
columns: vec![ColumnDef {
179181
name: "id".into(),
180-
r#type: ColumnType::Integer,
182+
r#type: ColumnType::Simple(SimpleColumnType::Integer),
181183
nullable: false,
182184
default: None,
183185
comment: None,
@@ -203,7 +205,7 @@ mod tests {
203205
table: "users".into(),
204206
columns: vec![ColumnDef {
205207
name: "id".into(),
206-
r#type: ColumnType::Integer,
208+
r#type: ColumnType::Simple(SimpleColumnType::Integer),
207209
nullable: false,
208210
default: None,
209211
comment: None,

0 commit comments

Comments
 (0)