Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions drizzle-kit/src/cli/validations/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export const pushParams = object({
schemaFilter: union([string(), string().array()])
.optional()
.default(['public']),
extensionsFilters: literal('postgis').array().optional(),
extensionsFilters: union([literal('postgis'), literal('pg_stat_statements')]).array().optional(),
verbose: boolean().optional(),
strict: boolean().optional(),
entities: object({
Expand All @@ -45,7 +45,7 @@ export const pullParams = object({
schemaFilter: union([string(), string().array()])
.optional()
.default(['public']),
extensionsFilters: literal('postgis').array().optional(),
extensionsFilters: union([literal('postgis'), literal('pg_stat_statements')]).array().optional(),
casing,
breakpoints: boolean().optional().default(true),
migrations: object({
Expand Down
17 changes: 10 additions & 7 deletions drizzle-kit/src/extensions/getTablesFilterByExtensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ export const getTablesFilterByExtensions = ({
extensionsFilters,
dialect,
}: Pick<Config, 'extensionsFilters' | 'dialect'>): string[] => {
if (extensionsFilters) {
if (
extensionsFilters.includes('postgis')
&& dialect === 'postgresql'
) {
return ['!geography_columns', '!geometry_columns', '!spatial_ref_sys'];
const filters: string[] = [];

if (extensionsFilters && dialect === 'postgresql') {
if (extensionsFilters.includes('postgis')) {
filters.push('!geography_columns', '!geometry_columns', '!spatial_ref_sys');
}
if (extensionsFilters.includes('pg_stat_statements')) {
filters.push('!pg_stat_*');
}
}
return [];

return filters;
};
26 changes: 25 additions & 1 deletion drizzle-kit/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,18 @@ type Verify<T, U extends T> = U;
*
* ---
*
* `extensionsFilters` - parameter allows you to filter out tables created by PostgreSQL extensions.
* This parameter accepts an array of extension names. Currently supported extensions:
* - 'postgis' - filters out geography_columns, geometry_columns, and spatial_ref_sys tables
* - 'pg_stat_statements' - filters out all pg_stat_* tables
*
* For example, having extensionsFilters: ["postgis", "pg_stat_statements"] will automatically filter out
* all extension-related tables from introspect and push operations.
*
* See https://orm.drizzle.team/kit-docs/config-reference#extensionsfilters
*
* ---
*
* `schemaFilter` - parameter allows you to define which schema in PostgreSQL should be used for either introspect or push commands.
* This parameter accepts a single schema as a string or an array of schemas as strings.
* No glob pattern is supported here. By default, drizzle will use the public schema for both commands,
Expand Down Expand Up @@ -112,7 +124,7 @@ export type Config =
out?: string;
breakpoints?: boolean;
tablesFilter?: string | string[];
extensionsFilters?: 'postgis'[];
extensionsFilters?: ('postgis' | 'pg_stat_statements')[];
schemaFilter?: string | string[];
schema?: string | string[];
verbose?: boolean;
Expand Down Expand Up @@ -318,6 +330,18 @@ export type Config =
*
* ---
*
* `extensionsFilters` - parameter allows you to filter out tables created by PostgreSQL extensions.
* This parameter accepts an array of extension names. Currently supported extensions:
* - 'postgis' - filters out geography_columns, geometry_columns, and spatial_ref_sys tables
* - 'pg_stat_statements' - filters out all pg_stat_* tables
*
* For example, having extensionsFilters: ["postgis", "pg_stat_statements"] will automatically filter out
* all extension-related tables from introspect and push operations.
*
* See https://orm.drizzle.team/kit-docs/config-reference#extensionsfilters
*
* ---
*
* `schemaFilter` - parameter allows you to define which schema in PostgreSQL should be used for either introspect or push commands.
* This parameter accepts a single schema as a string or an array of schemas as strings.
* No glob pattern is supported here. By default, drizzle will use the public schema for both commands,
Expand Down
56 changes: 56 additions & 0 deletions drizzle-kit/tests/extensions.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { expect, test } from 'vitest';
import { getTablesFilterByExtensions } from '../src/extensions/getTablesFilterByExtensions';

test('postgis extension filters', () => {
const filters = getTablesFilterByExtensions({
extensionsFilters: ['postgis'],
dialect: 'postgresql',
});

expect(filters).toEqual([
'!geography_columns',
'!geometry_columns',
'!spatial_ref_sys',
]);
});

test('pg_stat_statements extension filters', () => {
const filters = getTablesFilterByExtensions({
extensionsFilters: ['pg_stat_statements'],
dialect: 'postgresql',
});

expect(filters).toEqual(['!pg_stat_*']);
});

test('multiple extensions filters', () => {
const filters = getTablesFilterByExtensions({
extensionsFilters: ['postgis', 'pg_stat_statements'],
dialect: 'postgresql',
});

expect(filters).toEqual([
'!geography_columns',
'!geometry_columns',
'!spatial_ref_sys',
'!pg_stat_*',
]);
});

test('no extension filters', () => {
const filters = getTablesFilterByExtensions({
extensionsFilters: undefined,
dialect: 'postgresql',
});

expect(filters).toEqual([]);
});

test('extension filters only for postgresql', () => {
const filters = getTablesFilterByExtensions({
extensionsFilters: ['postgis', 'pg_stat_statements'],
dialect: 'mysql',
});

expect(filters).toEqual([]);
});