Skip to content

Commit fbe66a1

Browse files
committed
fix(typegen): omit columns when querying tables
Or views etc. This can be expensive on a complex enough schema and can easily trip over the 15s timeout. Instead, query all columns separately, which should hopefully be less taxing and easier to plan. Also omit excluded schemas when listing tables/views/etc.
1 parent fb2a539 commit fbe66a1

File tree

3 files changed

+74
-25
lines changed

3 files changed

+74
-25
lines changed

src/server/routes/generators/typescript.ts

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,31 @@ export default async (fastify: FastifyInstance) => {
2020

2121
const pgMeta: PostgresMeta = new PostgresMeta({ ...DEFAULT_POOL_CONFIG, connectionString })
2222
const { data: schemas, error: schemasError } = await pgMeta.schemas.list()
23-
const { data: tables, error: tablesError } = await pgMeta.tables.list()
24-
const { data: views, error: viewsError } = await pgMeta.views.list()
23+
const { data: tables, error: tablesError } = await pgMeta.tables.list({
24+
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
25+
excludedSchemas,
26+
includeColumns: false,
27+
})
28+
const { data: views, error: viewsError } = await pgMeta.views.list({
29+
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
30+
excludedSchemas,
31+
includeColumns: false,
32+
})
2533
const { data: materializedViews, error: materializedViewsError } =
26-
await pgMeta.materializedViews.list({ includeColumns: true })
34+
await pgMeta.materializedViews.list({
35+
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
36+
excludedSchemas,
37+
includeColumns: false,
38+
})
39+
const { data: columns, error: columnsError } = await pgMeta.columns.list({
40+
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
41+
excludedSchemas,
42+
})
2743
const { data: relationships, error: relationshipsError } = await pgMeta.relationships.list()
28-
const { data: functions, error: functionsError } = await pgMeta.functions.list()
44+
const { data: functions, error: functionsError } = await pgMeta.functions.list({
45+
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
46+
excludedSchemas,
47+
})
2948
const { data: types, error: typesError } = await pgMeta.types.list({
3049
includeArrayTypes: true,
3150
includeSystemSchemas: true,
@@ -55,6 +74,11 @@ export default async (fastify: FastifyInstance) => {
5574
reply.code(500)
5675
return { error: materializedViewsError.message }
5776
}
77+
if (columnsError) {
78+
request.log.error({ error: columns, request: extractRequestForLogging(request) })
79+
reply.code(500)
80+
return { error: columnsError.message }
81+
}
5882
if (relationshipsError) {
5983
request.log.error({ error: relationshipsError, request: extractRequestForLogging(request) })
6084
reply.code(500)
@@ -80,6 +104,7 @@ export default async (fastify: FastifyInstance) => {
80104
tables,
81105
views,
82106
materializedViews,
107+
columns,
83108
relationships,
84109
functions: functions.filter(
85110
({ return_type }) => !['trigger', 'event_trigger'].includes(return_type)

src/server/server.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,26 @@ if (EXPORT_DOCS) {
3737
connectionString: PG_CONNECTION,
3838
})
3939
const { data: schemas, error: schemasError } = await pgMeta.schemas.list()
40-
const { data: tables, error: tablesError } = await pgMeta.tables.list()
41-
const { data: views, error: viewsError } = await pgMeta.views.list()
40+
const { data: tables, error: tablesError } = await pgMeta.tables.list({
41+
includedSchemas: GENERATE_TYPES_INCLUDED_SCHEMAS.length > 0 ? GENERATE_TYPES_INCLUDED_SCHEMAS : undefined,
42+
includeColumns: false,
43+
})
44+
const { data: views, error: viewsError } = await pgMeta.views.list({
45+
includedSchemas: GENERATE_TYPES_INCLUDED_SCHEMAS.length > 0 ? GENERATE_TYPES_INCLUDED_SCHEMAS : undefined,
46+
includeColumns: false,
47+
})
4248
const { data: materializedViews, error: materializedViewsError } =
43-
await pgMeta.materializedViews.list({ includeColumns: true })
49+
await pgMeta.materializedViews.list({
50+
includedSchemas: GENERATE_TYPES_INCLUDED_SCHEMAS.length > 0 ? GENERATE_TYPES_INCLUDED_SCHEMAS : undefined,
51+
includeColumns: false,
52+
})
53+
const { data: columns, error: columnsError } = await pgMeta.columns.list({
54+
includedSchemas: GENERATE_TYPES_INCLUDED_SCHEMAS.length > 0 ? GENERATE_TYPES_INCLUDED_SCHEMAS : undefined,
55+
})
4456
const { data: relationships, error: relationshipsError } = await pgMeta.relationships.list()
45-
const { data: functions, error: functionsError } = await pgMeta.functions.list()
57+
const { data: functions, error: functionsError } = await pgMeta.functions.list({
58+
includedSchemas: GENERATE_TYPES_INCLUDED_SCHEMAS.length > 0 ? GENERATE_TYPES_INCLUDED_SCHEMAS : undefined,
59+
})
4660
const { data: types, error: typesError } = await pgMeta.types.list({
4761
includeArrayTypes: true,
4862
includeSystemSchemas: true,
@@ -61,6 +75,9 @@ if (EXPORT_DOCS) {
6175
if (materializedViewsError) {
6276
throw new Error(materializedViewsError.message)
6377
}
78+
if (columnsError) {
79+
throw new Error(columnsError.message)
80+
}
6481
if (relationshipsError) {
6582
throw new Error(relationshipsError.message)
6683
}
@@ -81,6 +98,7 @@ if (EXPORT_DOCS) {
8198
tables,
8299
views,
83100
materializedViews,
101+
columns,
84102
relationships,
85103
functions: functions.filter(
86104
({ return_type }) => !['trigger', 'event_trigger'].includes(return_type)

src/server/templates/typescript.ts

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import prettier from 'prettier'
22
import type {
3+
PostgresColumn,
34
PostgresFunction,
45
PostgresMaterializedView,
56
PostgresRelationship,
@@ -14,15 +15,17 @@ export const apply = ({
1415
tables,
1516
views,
1617
materializedViews,
18+
columns,
1719
relationships,
1820
functions,
1921
types,
2022
arrayTypes,
2123
}: {
2224
schemas: PostgresSchema[]
23-
tables: (PostgresTable & { columns: unknown[] })[]
24-
views: (PostgresView & { columns: unknown[] })[]
25-
materializedViews: (PostgresMaterializedView & { columns: unknown[] })[]
25+
tables: Omit<PostgresTable, 'columns'>[]
26+
views: Omit<PostgresView, 'columns'>[]
27+
materializedViews: Omit<PostgresMaterializedView, 'columns'>[]
28+
columns: PostgresColumn[]
2629
relationships: PostgresRelationship[]
2730
functions: PostgresFunction[]
2831
types: PostgresType[]
@@ -41,6 +44,9 @@ export interface Database {
4144
const schemaViews = [...views, ...materializedViews]
4245
.filter((view) => view.schema === schema.name)
4346
.sort(({ name: a }, { name: b }) => a.localeCompare(b))
47+
const schemaColumns = columns
48+
.filter((column) => column.schema === schema.name)
49+
.sort(({ name: a }, { name: b }) => a.localeCompare(b))
4450
const schemaFunctions = functions
4551
.filter((func) => {
4652
if (func.schema !== schema.name) {
@@ -78,8 +84,8 @@ export interface Database {
7884
(table) => `${JSON.stringify(table.name)}: {
7985
Row: {
8086
${[
81-
...table.columns
82-
.sort(({ name: a }, { name: b }) => a.localeCompare(b))
87+
...schemaColumns
88+
.filter((column) => column.table_id === table.id)
8389
.map(
8490
(column) =>
8591
`${JSON.stringify(column.name)}: ${pgTypeToTsType(
@@ -101,8 +107,8 @@ export interface Database {
101107
]}
102108
}
103109
Insert: {
104-
${table.columns
105-
.sort(({ name: a }, { name: b }) => a.localeCompare(b))
110+
${schemaColumns
111+
.filter((column) => column.table_id === table.id)
106112
.map((column) => {
107113
let output = JSON.stringify(column.name)
108114
@@ -130,8 +136,8 @@ export interface Database {
130136
})}
131137
}
132138
Update: {
133-
${table.columns
134-
.sort(({ name: a }, { name: b }) => a.localeCompare(b))
139+
${schemaColumns
140+
.filter((column) => column.table_id === table.id)
135141
.map((column) => {
136142
let output = JSON.stringify(column.name)
137143
@@ -178,8 +184,8 @@ export interface Database {
178184
: schemaViews.map(
179185
(view) => `${JSON.stringify(view.name)}: {
180186
Row: {
181-
${view.columns
182-
.sort(({ name: a }, { name: b }) => a.localeCompare(b))
187+
${schemaColumns
188+
.filter((column) => column.table_id === view.id)
183189
.map(
184190
(column) =>
185191
`${JSON.stringify(column.name)}: ${pgTypeToTsType(
@@ -192,8 +198,8 @@ export interface Database {
192198
${
193199
'is_updatable' in view && view.is_updatable
194200
? `Insert: {
195-
${view.columns
196-
.sort(({ name: a }, { name: b }) => a.localeCompare(b))
201+
${schemaColumns
202+
.filter((column) => column.table_id === view.id)
197203
.map((column) => {
198204
let output = JSON.stringify(column.name)
199205
@@ -211,8 +217,8 @@ export interface Database {
211217
})}
212218
}
213219
Update: {
214-
${view.columns
215-
.sort(({ name: a }, { name: b }) => a.localeCompare(b))
220+
${schemaColumns
221+
.filter((column) => column.table_id === view.id)
216222
.map((column) => {
217223
let output = JSON.stringify(column.name)
218224
@@ -345,8 +351,8 @@ export interface Database {
345351
)
346352
if (relation) {
347353
return `{
348-
${relation.columns
349-
.sort(({ name: a }, { name: b }) => a.localeCompare(b))
354+
${schemaColumns
355+
.filter((column) => column.table_id === relation.id)
350356
.map(
351357
(column) =>
352358
`${JSON.stringify(column.name)}: ${pgTypeToTsType(

0 commit comments

Comments
 (0)