Skip to content

Commit 108f73d

Browse files
feat: honor omit_unused_structs (#74)
Port Go's filterUnusedStructs so unused table and enum models are omitted from models.py when the option is set. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 53fa0b2 commit 108f73d

8 files changed

Lines changed: 462 additions & 7 deletions

File tree

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,9 @@ class Status(str, enum.Enum):
7676
OPEN = "op!en"
7777
CLOSED = "clo@sed"
7878
```
79+
80+
### Omit unused table and enum structs
81+
82+
Option: `omit_unused_structs`
83+
84+
If `true`, sqlc won't generate table and enum structs that aren't used in queries for a given package.

internal/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ type Config struct {
88
Out string `json:"out"`
99
EmitPydanticModels bool `json:"emit_pydantic_models"`
1010
EmitStrEnum bool `json:"emit_str_enum"`
11+
OmitUnusedStructs bool `json:"omit_unused_structs,omitempty"`
1112
QueryParameterLimit *int32 `json:"query_parameter_limit"`
1213
InflectionExcludeTableNames []string `json:"inflection_exclude_table_names"`
1314
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# Code generated by sqlc. DO NOT EDIT.
2+
# versions:
3+
# sqlc v1.28.0
4+
import dataclasses
5+
import enum
6+
from typing import List, Optional
7+
8+
9+
class ArrayEnum(enum.StrEnum):
10+
O = "o"
11+
P = "p"
12+
13+
14+
class QueryParamEnumTableEnum(enum.StrEnum):
15+
G = "g"
16+
H = "h"
17+
18+
19+
class QueryParamStructEnumTableEnum(enum.StrEnum):
20+
I = "i"
21+
J = "j"
22+
23+
24+
class QueryReturnEnumTableEnum(enum.StrEnum):
25+
K = "k"
26+
L = "l"
27+
28+
29+
class QueryReturnFullTableEnum(enum.StrEnum):
30+
E = "e"
31+
F = "f"
32+
33+
34+
class QueryReturnStructEnumTableEnum(enum.StrEnum):
35+
K = "k"
36+
L = "l"
37+
38+
39+
class QuerySqlcEmbedEnum(enum.StrEnum):
40+
M = "m"
41+
N = "n"
42+
43+
44+
@dataclasses.dataclass()
45+
class ArrayEnumTable:
46+
id: int
47+
value: Optional[List[ArrayEnum]]
48+
49+
50+
@dataclasses.dataclass()
51+
class QueryParamEnumTable:
52+
id: int
53+
other: QueryParamEnumTableEnum
54+
value: Optional[QueryParamEnumTableEnum]
55+
56+
57+
@dataclasses.dataclass()
58+
class QueryReturnFullTable:
59+
id: int
60+
value: Optional[QueryReturnFullTableEnum]
61+
62+
63+
@dataclasses.dataclass()
64+
class QuerySqlcEmbedTable:
65+
id: int
66+
value: Optional[QuerySqlcEmbedEnum]
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
# Code generated by sqlc. DO NOT EDIT.
2+
# versions:
3+
# sqlc v1.28.0
4+
# source: query.sql
5+
import dataclasses
6+
from typing import Any, AsyncIterator, Iterator, Optional
7+
8+
import sqlalchemy
9+
import sqlalchemy.ext.asyncio
10+
11+
from db import models
12+
13+
14+
QUERY_ENUM_ARRAY_TABLE = """-- name: query_enum_array_table \\:many
15+
SELECT id, value FROM array_enum_table
16+
"""
17+
18+
19+
QUERY_PARAM_ENUM_TABLE = """-- name: query_param_enum_table \\:one
20+
SELECT id, other, value FROM query_param_enum_table WHERE value = :p1
21+
"""
22+
23+
24+
QUERY_PARAM_STRUCT_ENUM_TABLE = """-- name: query_param_struct_enum_table \\:one
25+
SELECT id FROM query_param_struct_enum_table WHERE id = :p1 AND value = :p2
26+
"""
27+
28+
29+
QUERY_RETURN_ENUM_TABLE = """-- name: query_return_enum_table \\:one
30+
SELECT value FROM query_return_enum_table WHERE id = :p1
31+
"""
32+
33+
34+
QUERY_RETURN_FULL_TABLE = """-- name: query_return_full_table \\:many
35+
SELECT id, value FROM query_return_full_table
36+
"""
37+
38+
39+
QUERY_RETURN_STRUCT_ENUM_TABLE = """-- name: query_return_struct_enum_table \\:one
40+
SELECT value, another FROM query_return_struct_enum_table WHERE id = :p1
41+
"""
42+
43+
44+
@dataclasses.dataclass()
45+
class query_return_struct_enum_tableRow:
46+
value: Optional[models.QueryReturnStructEnumTableEnum]
47+
another: Optional[int]
48+
49+
50+
QUERY_SQLC_EMBED_TABLE = """-- name: query_sqlc_embed_table \\:one
51+
SELECT query_sqlc_embed_table.id, query_sqlc_embed_table.value FROM query_sqlc_embed_table WHERE id = :p1
52+
"""
53+
54+
55+
class Querier:
56+
def __init__(self, conn: sqlalchemy.engine.Connection):
57+
self._conn = conn
58+
59+
def query_enum_array_table(self) -> Iterator[models.ArrayEnumTable]:
60+
result = self._conn.execute(sqlalchemy.text(QUERY_ENUM_ARRAY_TABLE))
61+
for row in result:
62+
yield models.ArrayEnumTable(
63+
id=row[0],
64+
value=row[1],
65+
)
66+
67+
def query_param_enum_table(self, *, value: Optional[models.QueryParamEnumTableEnum]) -> Optional[models.QueryParamEnumTable]:
68+
row = self._conn.execute(sqlalchemy.text(QUERY_PARAM_ENUM_TABLE), {"p1": value}).first()
69+
if row is None:
70+
return None
71+
return models.QueryParamEnumTable(
72+
id=row[0],
73+
other=row[1],
74+
value=row[2],
75+
)
76+
77+
def query_param_struct_enum_table(self, *, id: int, value: Optional[models.QueryParamStructEnumTableEnum]) -> Optional[int]:
78+
row = self._conn.execute(sqlalchemy.text(QUERY_PARAM_STRUCT_ENUM_TABLE), {"p1": id, "p2": value}).first()
79+
if row is None:
80+
return None
81+
return row[0]
82+
83+
def query_return_enum_table(self, *, id: int) -> Optional[Optional[models.QueryReturnEnumTableEnum]]:
84+
row = self._conn.execute(sqlalchemy.text(QUERY_RETURN_ENUM_TABLE), {"p1": id}).first()
85+
if row is None:
86+
return None
87+
return row[0]
88+
89+
def query_return_full_table(self) -> Iterator[models.QueryReturnFullTable]:
90+
result = self._conn.execute(sqlalchemy.text(QUERY_RETURN_FULL_TABLE))
91+
for row in result:
92+
yield models.QueryReturnFullTable(
93+
id=row[0],
94+
value=row[1],
95+
)
96+
97+
def query_return_struct_enum_table(self, *, id: int) -> Optional[query_return_struct_enum_tableRow]:
98+
row = self._conn.execute(sqlalchemy.text(QUERY_RETURN_STRUCT_ENUM_TABLE), {"p1": id}).first()
99+
if row is None:
100+
return None
101+
return query_return_struct_enum_tableRow(
102+
value=row[0],
103+
another=row[1],
104+
)
105+
106+
def query_sqlc_embed_table(self, *, id: int) -> Optional[Optional[Any]]:
107+
row = self._conn.execute(sqlalchemy.text(QUERY_SQLC_EMBED_TABLE), {"p1": id}).first()
108+
if row is None:
109+
return None
110+
return row[0]
111+
112+
113+
class AsyncQuerier:
114+
def __init__(self, conn: sqlalchemy.ext.asyncio.AsyncConnection):
115+
self._conn = conn
116+
117+
async def query_enum_array_table(self) -> AsyncIterator[models.ArrayEnumTable]:
118+
result = await self._conn.stream(sqlalchemy.text(QUERY_ENUM_ARRAY_TABLE))
119+
async for row in result:
120+
yield models.ArrayEnumTable(
121+
id=row[0],
122+
value=row[1],
123+
)
124+
125+
async def query_param_enum_table(self, *, value: Optional[models.QueryParamEnumTableEnum]) -> Optional[models.QueryParamEnumTable]:
126+
row = (await self._conn.execute(sqlalchemy.text(QUERY_PARAM_ENUM_TABLE), {"p1": value})).first()
127+
if row is None:
128+
return None
129+
return models.QueryParamEnumTable(
130+
id=row[0],
131+
other=row[1],
132+
value=row[2],
133+
)
134+
135+
async def query_param_struct_enum_table(self, *, id: int, value: Optional[models.QueryParamStructEnumTableEnum]) -> Optional[int]:
136+
row = (await self._conn.execute(sqlalchemy.text(QUERY_PARAM_STRUCT_ENUM_TABLE), {"p1": id, "p2": value})).first()
137+
if row is None:
138+
return None
139+
return row[0]
140+
141+
async def query_return_enum_table(self, *, id: int) -> Optional[Optional[models.QueryReturnEnumTableEnum]]:
142+
row = (await self._conn.execute(sqlalchemy.text(QUERY_RETURN_ENUM_TABLE), {"p1": id})).first()
143+
if row is None:
144+
return None
145+
return row[0]
146+
147+
async def query_return_full_table(self) -> AsyncIterator[models.QueryReturnFullTable]:
148+
result = await self._conn.stream(sqlalchemy.text(QUERY_RETURN_FULL_TABLE))
149+
async for row in result:
150+
yield models.QueryReturnFullTable(
151+
id=row[0],
152+
value=row[1],
153+
)
154+
155+
async def query_return_struct_enum_table(self, *, id: int) -> Optional[query_return_struct_enum_tableRow]:
156+
row = (await self._conn.execute(sqlalchemy.text(QUERY_RETURN_STRUCT_ENUM_TABLE), {"p1": id})).first()
157+
if row is None:
158+
return None
159+
return query_return_struct_enum_tableRow(
160+
value=row[0],
161+
another=row[1],
162+
)
163+
164+
async def query_sqlc_embed_table(self, *, id: int) -> Optional[Optional[Any]]:
165+
row = (await self._conn.execute(sqlalchemy.text(QUERY_SQLC_EMBED_TABLE), {"p1": id})).first()
166+
if row is None:
167+
return None
168+
return row[0]
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-- name: query_return_full_table :many
2+
SELECT * FROM query_return_full_table;
3+
4+
-- name: query_param_enum_table :one
5+
SELECT * FROM query_param_enum_table WHERE value = $1;
6+
7+
-- name: query_param_struct_enum_table :one
8+
SELECT id FROM query_param_struct_enum_table WHERE id = $1 AND value = $2;
9+
10+
-- name: query_return_enum_table :one
11+
SELECT value FROM query_return_enum_table WHERE id = $1;
12+
13+
-- name: query_return_struct_enum_table :one
14+
SELECT value, another FROM query_return_struct_enum_table WHERE id = $1;
15+
16+
-- name: query_sqlc_embed_table :one
17+
SELECT sqlc.embed(query_sqlc_embed_table) FROM query_sqlc_embed_table WHERE id = $1;
18+
19+
-- name: query_enum_array_table :many
20+
SELECT * FROM array_enum_table;
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
CREATE TYPE unused_enum AS ENUM (
2+
'a', 'b'
3+
);
4+
5+
CREATE TYPE unused_table_enum AS ENUM (
6+
'c', 'd'
7+
);
8+
CREATE TABLE unused_table (
9+
id INTEGER PRIMARY KEY,
10+
value unused_table_enum
11+
);
12+
13+
CREATE TYPE query_return_full_table_enum AS ENUM (
14+
'e', 'f'
15+
);
16+
CREATE TABLE query_return_full_table (
17+
id INTEGER PRIMARY KEY,
18+
value query_return_full_table_enum
19+
);
20+
21+
CREATE TYPE query_param_enum_table_enum AS ENUM (
22+
'g', 'h'
23+
);
24+
CREATE TABLE query_param_enum_table (
25+
id INTEGER PRIMARY KEY,
26+
other query_param_enum_table_enum NOT NULL,
27+
value query_param_enum_table_enum
28+
);
29+
30+
CREATE TYPE query_param_struct_enum_table_enum AS ENUM (
31+
'i', 'j'
32+
);
33+
CREATE TABLE query_param_struct_enum_table (
34+
id INTEGER PRIMARY KEY,
35+
value query_param_struct_enum_table_enum
36+
);
37+
38+
CREATE TYPE query_return_enum_table_enum AS ENUM (
39+
'k', 'l'
40+
);
41+
CREATE TABLE query_return_enum_table (
42+
id INTEGER PRIMARY KEY,
43+
value query_return_enum_table_enum
44+
);
45+
46+
CREATE TYPE query_return_struct_enum_table_enum AS ENUM (
47+
'k', 'l'
48+
);
49+
CREATE TABLE query_return_struct_enum_table (
50+
id INTEGER PRIMARY KEY,
51+
value query_return_struct_enum_table_enum,
52+
another INTEGER
53+
);
54+
55+
CREATE TYPE query_sqlc_embed_enum AS ENUM (
56+
'm', 'n'
57+
);
58+
CREATE TABLE query_sqlc_embed_table (
59+
id INTEGER PRIMARY KEY,
60+
value query_sqlc_embed_enum
61+
);
62+
63+
CREATE TYPE array_enum AS ENUM (
64+
'o', 'p'
65+
);
66+
CREATE TABLE array_enum_table (
67+
id INTEGER PRIMARY KEY,
68+
value array_enum[]
69+
);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
version: "2"
2+
plugins:
3+
- name: py
4+
wasm:
5+
url: file://../../../../bin/sqlc-gen-python.wasm
6+
sha256: "d6846ffad948181e611e883cedd2d2be66e091edc1273a0abc6c9da18399e0ca"
7+
sql:
8+
- schema: schema.sql
9+
queries: query.sql
10+
engine: postgresql
11+
codegen:
12+
- plugin: py
13+
out: db
14+
options:
15+
package: db
16+
emit_sync_querier: true
17+
emit_async_querier: true
18+
emit_str_enum: true
19+
omit_unused_structs: true

0 commit comments

Comments
 (0)