Skip to content

Commit 1bd39a9

Browse files
authored
Merge pull request #182 from drizzle-team/orm-162-support-network-types
Add Postgres network data types
2 parents 568a413 + 97af5c2 commit 1bd39a9

File tree

10 files changed

+198
-13
lines changed

10 files changed

+198
-13
lines changed

changelogs/drizzle-orm/0.20.2.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
- 🎉 Added PostgreSQL network data types:
2+
- `inet`
3+
- `cidr`
4+
- `macaddr`
5+
- `macaddr8`

drizzle-orm/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "drizzle-orm",
3-
"version": "0.20.1",
3+
"version": "0.20.2",
44
"description": "Drizzle ORM package for SQL databases",
55
"scripts": {
66
"build": "tsc && resolve-tspaths && cp ../README.md package.json dist/",
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { ColumnConfig } from '~/column';
2+
import { ColumnBuilderConfig } from '~/column-builder';
3+
import { AnyPgTable } from '../table';
4+
import { PgColumn, PgColumnBuilder } from './common';
5+
6+
export class PgCidrBuilder extends PgColumnBuilder<ColumnBuilderConfig<{ data: string; driverParam: string }>> {
7+
protected override $pgColumnBuilderBrand!: 'PgCidrBuilder';
8+
9+
/** @internal */
10+
override build<TTableName extends string>(table: AnyPgTable<{ name: TTableName }>): PgCidr<TTableName> {
11+
return new PgCidr(table, this.config);
12+
}
13+
}
14+
15+
export class PgCidr<TTableName extends string> extends PgColumn<
16+
ColumnConfig<{
17+
tableName: TTableName;
18+
data: string;
19+
driverParam: string;
20+
}>
21+
> {
22+
protected override $pgColumnBrand!: 'PgCidr';
23+
24+
getSQLType(): string {
25+
return 'cidr';
26+
}
27+
}
28+
29+
export function cidr(name: string) {
30+
return new PgCidrBuilder(name);
31+
}

drizzle-orm/src/pg-core/columns/custom.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ColumnBuilderConfig } from '~/column-builder';
33
import { AnyPgTable } from '~/pg-core/table';
44
import { PgColumn, PgColumnBuilder } from './common';
55

6-
export type CustomColumnBuildeConfig<T extends CustomTypeValues> = {
6+
export type CustomColumnBuilderConfig<T extends CustomTypeValues> = {
77
data: T['data'];
88
driverParam: T['driverData'];
99
notNull: T['notNull'] extends undefined ? false : T['notNull'] extends true ? true : false;
@@ -118,7 +118,7 @@ export type CustomTypeValues = {
118118

119119
export interface CustomTypeParams<T extends CustomTypeValues> {
120120
/**
121-
* Database data type string represenation, that is used for migrations
121+
* Database data type string representation, that is used for migrations
122122
* @example
123123
* ```
124124
* `jsonb`, `text`
@@ -184,12 +184,12 @@ export function customType<
184184
dbName: string,
185185
fieldConfig?: T['config'],
186186
) => PgColumnBuilder<
187-
ColumnBuilderConfig<CustomColumnBuildeConfig<T>>,
187+
ColumnBuilderConfig<CustomColumnBuilderConfig<T>>,
188188
Record<string, unknown>
189189
> {
190190
return (dbName: string, fieldConfig?: T['config']) =>
191191
new class extends PgColumnBuilder<
192-
ColumnBuilderConfig<CustomColumnBuildeConfig<T>>,
192+
ColumnBuilderConfig<CustomColumnBuilderConfig<T>>,
193193
Record<string, unknown>
194194
> {
195195
protected $pgColumnBuilderBrand!: 'CustomColumnBuilderBrand';
@@ -198,7 +198,7 @@ export function customType<
198198
build<TTableName extends string>(
199199
table: AnyPgTable<{ name: TTableName }>,
200200
): PgColumn<
201-
ColumnConfig<CustomColumnBuildeConfig<T> & { tableName: TTableName }>
201+
ColumnConfig<CustomColumnBuilderConfig<T> & { tableName: TTableName }>
202202
> {
203203
return returnColumn(
204204
table,

drizzle-orm/src/pg-core/columns/index.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
export * from './bigint';
22
export * from './bigserial';
33
export * from './boolean';
4+
export * from './char';
5+
export * from './cidr';
46
export { PgColumn } from './common';
57
export type { AnyPgColumn } from './common';
8+
export * from './custom';
69
export * from './date';
710
export * from './double-precision';
811
export * from './enum';
12+
export * from './inet';
913
export * from './integer';
1014
export * from './interval';
1115
export * from './json';
1216
export * from './jsonb';
17+
export * from './macaddr';
18+
export * from './macaddr8';
1319
export * from './numeric';
1420
export * from './real';
1521
export * from './serial';
@@ -20,5 +26,3 @@ export * from './time';
2026
export * from './timestamp';
2127
export * from './uuid';
2228
export * from './varchar';
23-
export * from './custom';
24-
export * from './char';
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { ColumnConfig } from '~/column';
2+
import { ColumnBuilderConfig } from '~/column-builder';
3+
import { AnyPgTable } from '../table';
4+
import { PgColumn, PgColumnBuilder } from './common';
5+
6+
export class PgInetBuilder extends PgColumnBuilder<ColumnBuilderConfig<{ data: string; driverParam: string }>> {
7+
protected override $pgColumnBuilderBrand!: 'PgInetBuilder';
8+
9+
/** @internal */
10+
override build<TTableName extends string>(table: AnyPgTable<{ name: TTableName }>): PgInet<TTableName> {
11+
return new PgInet(table, this.config);
12+
}
13+
}
14+
15+
export class PgInet<TTableName extends string> extends PgColumn<
16+
ColumnConfig<{
17+
tableName: TTableName;
18+
data: string;
19+
driverParam: string;
20+
}>
21+
> {
22+
protected override $pgColumnBrand!: 'PgInet';
23+
24+
getSQLType(): string {
25+
return 'inet';
26+
}
27+
}
28+
29+
export function inet(name: string) {
30+
return new PgInetBuilder(name);
31+
}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { ColumnConfig } from '~/column';
2+
import { ColumnBuilderConfig } from '~/column-builder';
3+
import { AnyPgTable } from '../table';
4+
import { PgColumn, PgColumnBuilder } from './common';
5+
6+
export class PgMacaddrBuilder extends PgColumnBuilder<ColumnBuilderConfig<{ data: string; driverParam: string }>> {
7+
protected override $pgColumnBuilderBrand!: 'PgMacaddrBuilder';
8+
9+
/** @internal */
10+
override build<TTableName extends string>(table: AnyPgTable<{ name: TTableName }>): PgMacaddr<TTableName> {
11+
return new PgMacaddr(table, this.config);
12+
}
13+
}
14+
15+
export class PgMacaddr<TTableName extends string> extends PgColumn<
16+
ColumnConfig<{
17+
tableName: TTableName;
18+
data: string;
19+
driverParam: string;
20+
}>
21+
> {
22+
protected override $pgColumnBrand!: 'PgMacaddr';
23+
24+
getSQLType(): string {
25+
return 'macaddr';
26+
}
27+
}
28+
29+
export function macaddr(name: string) {
30+
return new PgMacaddrBuilder(name);
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { ColumnConfig } from '~/column';
2+
import { ColumnBuilderConfig } from '~/column-builder';
3+
import { AnyPgTable } from '../table';
4+
import { PgColumn, PgColumnBuilder } from './common';
5+
6+
export class PgMacaddr8Builder extends PgColumnBuilder<ColumnBuilderConfig<{ data: string; driverParam: string }>> {
7+
protected override $pgColumnBuilderBrand!: 'PgMacaddr8Builder';
8+
9+
/** @internal */
10+
override build<TTableName extends string>(table: AnyPgTable<{ name: TTableName }>): PgMacaddr8<TTableName> {
11+
return new PgMacaddr8(table, this.config);
12+
}
13+
}
14+
15+
export class PgMacaddr8<TTableName extends string> extends PgColumn<
16+
ColumnConfig<{
17+
tableName: TTableName;
18+
data: string;
19+
driverParam: string;
20+
}>
21+
> {
22+
protected override $pgColumnBrand!: 'PgMacaddr8';
23+
24+
getSQLType(): string {
25+
return 'macaddr8';
26+
}
27+
}
28+
29+
export function macaddr8(name: string) {
30+
return new PgMacaddr8Builder(name);
31+
}

drizzle-orm/tests/pg/dan/tables.ts

+20-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { sql } from '~/sql';
2-
1+
import { Equal, Expect } from 'tests/utils';
32
import { check } from '~/pg-core/checks';
4-
import { integer, pgEnum, serial, text, timestamp, uuid } from '~/pg-core/columns';
3+
import { cidr, inet, integer, macaddr, macaddr8, pgEnum, serial, text, timestamp, uuid } from '~/pg-core/columns';
54
import { foreignKey } from '~/pg-core/foreign-keys';
65
import { index, uniqueIndex } from '~/pg-core/indexes';
7-
import { pgTable } from '~/pg-core/table';
6+
import { InferModel, pgTable } from '~/pg-core/table';
7+
import { sql } from '~/sql';
88

99
const myEnum = pgEnum('my_enum', ['a', 'b', 'c']);
1010

@@ -58,3 +58,19 @@ export const classes = pgTable('classes_table', {
5858
class: text<'A' | 'C'>('class'),
5959
subClass: text<'B' | 'D'>('sub_class').notNull(),
6060
});
61+
62+
export const network = pgTable('network_table', {
63+
inet: inet('inet').notNull(),
64+
cidr: cidr('cidr').notNull(),
65+
macaddr: macaddr('macaddr').notNull(),
66+
macaddr8: macaddr8('macaddr8').notNull(),
67+
});
68+
69+
Expect<
70+
Equal<{
71+
inet: string;
72+
cidr: string;
73+
macaddr: string;
74+
macaddr8: string;
75+
}, InferModel<typeof network>>
76+
>;

integration-tests/tests/pg.test.ts

+37-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import anyTest, { TestFn } from 'ava';
22
import Docker from 'dockerode';
3-
import { DefaultLogger, sql } from 'drizzle-orm';
3+
import { sql } from 'drizzle-orm';
44
import { asc, eq, gt, inArray } from 'drizzle-orm/expressions';
55
import { drizzle, NodePgDatabase } from 'drizzle-orm/node-postgres';
66
import { migrate } from 'drizzle-orm/node-postgres/migrator';
@@ -9,9 +9,13 @@ import {
99
AnyPgColumn,
1010
boolean,
1111
char,
12+
cidr,
13+
inet,
1214
InferModel,
1315
integer,
1416
jsonb,
17+
macaddr,
18+
macaddr8,
1519
pgTable,
1620
serial,
1721
text,
@@ -61,6 +65,13 @@ const orders = pgTable('orders', {
6165
quantity: integer('quantity').notNull(),
6266
});
6367

68+
const network = pgTable('network_table', {
69+
inet: inet('inet').notNull(),
70+
cidr: cidr('cidr').notNull(),
71+
macaddr: macaddr('macaddr').notNull(),
72+
macaddr8: macaddr8('macaddr8').notNull(),
73+
});
74+
6475
const usersMigratorTable = pgTable('users12', {
6576
id: serial('id').primaryKey(),
6677
name: text('name').notNull(),
@@ -179,6 +190,14 @@ test.beforeEach(async (t) => {
179190
quantity integer not null
180191
)`,
181192
);
193+
await ctx.db.execute(
194+
sql`create table network_table (
195+
inet inet not null,
196+
cidr cidr not null,
197+
macaddr macaddr not null,
198+
macaddr8 macaddr8 not null
199+
)`,
200+
);
182201
});
183202

184203
test.serial('select all fields', async (t) => {
@@ -1135,6 +1154,23 @@ test.serial('select count w/ custom mapper', async (t) => {
11351154
t.deepEqual(res, [{ count: 2 }]);
11361155
});
11371156

1157+
test.serial('network types', async (t) => {
1158+
const { db } = t.context;
1159+
1160+
const value: InferModel<typeof network> = {
1161+
inet: '127.0.0.1',
1162+
cidr: '192.168.100.128/25',
1163+
macaddr: '08:00:2b:01:02:03',
1164+
macaddr8: '08:00:2b:01:02:03:04:05',
1165+
};
1166+
1167+
await db.insert(network).values(value);
1168+
1169+
const res = await db.select().from(network);
1170+
1171+
t.deepEqual(res, [value]);
1172+
});
1173+
11381174
test.after.always(async (t) => {
11391175
const ctx = t.context;
11401176
await ctx.client?.end().catch(console.error);

0 commit comments

Comments
 (0)