Skip to content

Commit 06d9ab6

Browse files
authored
chore(python): Delete template-based codegen (#1345)
1 parent 117b5ec commit 06d9ab6

File tree

1 file changed

+2
-218
lines changed

1 file changed

+2
-218
lines changed

internal/codegen/python/gen.go

Lines changed: 2 additions & 218 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,6 @@ type pyType struct {
3737
IsNull bool
3838
}
3939

40-
func (t pyType) String() string {
41-
v := t.InnerType
42-
if t.IsArray {
43-
v = fmt.Sprintf("List[%s]", v)
44-
}
45-
if t.IsNull {
46-
v = fmt.Sprintf("Optional[%s]", v)
47-
}
48-
return v
49-
}
50-
5140
func (t pyType) Annotation() *pyast.Node {
5241
ann := poet.Name(t.InnerType)
5342
if t.IsArray {
@@ -105,40 +94,6 @@ func (v QueryValue) isEmpty() bool {
10594
return v.Typ == (pyType{}) && v.Name == "" && v.Struct == nil
10695
}
10796

108-
func (v QueryValue) Pair() string {
109-
if v.isEmpty() {
110-
return ""
111-
}
112-
return v.Name + ": " + v.Type()
113-
}
114-
115-
func (v QueryValue) Type() string {
116-
if v.Typ != (pyType{}) {
117-
return v.Typ.String()
118-
}
119-
if v.Struct != nil {
120-
if v.Emit {
121-
return v.Struct.Name
122-
} else {
123-
return "models." + v.Struct.Name
124-
}
125-
}
126-
panic("no type for QueryValue: " + v.Name)
127-
}
128-
129-
func (v QueryValue) StructRowParser(rowVar string, indentCount int) string {
130-
if !v.IsStruct() {
131-
panic("StructRowParse called on non-struct QueryValue")
132-
}
133-
indent := strings.Repeat(" ", indentCount+4)
134-
params := make([]string, 0, len(v.Struct.Fields))
135-
for i, f := range v.Struct.Fields {
136-
params = append(params, fmt.Sprintf("%s%s=%s[%v],", indent, f.Name, rowVar, i))
137-
}
138-
indent = strings.Repeat(" ", indentCount)
139-
return v.Type() + "(\n" + strings.Join(params, "\n") + "\n" + indent + ")"
140-
}
141-
14297
func (v QueryValue) RowNode(rowVar string) *pyast.Node {
14398
if !v.IsStruct() {
14499
return subscriptNode(
@@ -178,21 +133,6 @@ type Query struct {
178133
Args []QueryValue
179134
}
180135

181-
func (q Query) ArgPairs() string {
182-
// A single struct arg does not need to be passed as a keyword argument
183-
if len(q.Args) == 1 && q.Args[0].IsStruct() {
184-
return ", " + q.Args[0].Pair()
185-
}
186-
argPairs := make([]string, 0, len(q.Args))
187-
for _, a := range q.Args {
188-
argPairs = append(argPairs, a.Pair())
189-
}
190-
if len(argPairs) == 0 {
191-
return ""
192-
}
193-
return ", *, " + strings.Join(argPairs, ", ")
194-
}
195-
196136
func (q Query) AddArgs(args *pyast.Arguments) {
197137
// A single struct arg does not need to be passed as a keyword argument
198138
if len(q.Args) == 1 && q.Args[0].IsStruct() {
@@ -210,32 +150,6 @@ func (q Query) AddArgs(args *pyast.Arguments) {
210150
}
211151
}
212152

213-
func (q Query) ArgDict() string {
214-
params := make([]string, 0, len(q.Args))
215-
i := 1
216-
for _, a := range q.Args {
217-
if a.isEmpty() {
218-
continue
219-
}
220-
if a.IsStruct() {
221-
for _, f := range a.Struct.Fields {
222-
params = append(params, fmt.Sprintf("\"p%v\": %s", i, a.Name+"."+f.Name))
223-
i++
224-
}
225-
} else {
226-
params = append(params, fmt.Sprintf("\"p%v\": %s", i, a.Name))
227-
i++
228-
}
229-
}
230-
if len(params) == 0 {
231-
return ""
232-
}
233-
if len(params) < 4 {
234-
return ", {" + strings.Join(params, ", ") + "}"
235-
}
236-
return ", {\n " + strings.Join(params, ",\n ") + ",\n }"
237-
}
238-
239153
func (q Query) ArgDictNode() *pyast.Node {
240154
dict := &pyast.Dict{}
241155
i := 1
@@ -914,15 +828,15 @@ func buildQueryTree(ctx *pyTmplCtx, i *importer, source string) *pyast.Node {
914828
mod.Body = append(mod.Body, assignNode(q.ConstantName, poet.Constant(queryText)))
915829
for _, arg := range q.Args {
916830
if arg.EmitStruct() {
917-
def := dataclassNode(arg.Type())
831+
def := dataclassNode(arg.Struct.Name)
918832
for _, f := range arg.Struct.Fields {
919833
def.Body = append(def.Body, fieldNode(f))
920834
}
921835
mod.Body = append(mod.Body, poet.Node(def))
922836
}
923837
}
924838
if q.Ret.EmitStruct() {
925-
def := dataclassNode(q.Ret.Type())
839+
def := dataclassNode(q.Ret.Struct.Name)
926840
for _, f := range q.Ret.Struct.Fields {
927841
def.Body = append(def.Body, fieldNode(f))
928842
}
@@ -1118,136 +1032,6 @@ func buildQueryTree(ctx *pyTmplCtx, i *importer, source string) *pyast.Node {
11181032
return poet.Node(mod)
11191033
}
11201034

1121-
var queriesTmpl = `
1122-
{{- define "dataclassParse"}}
1123-
1124-
{{end}}
1125-
# Code generated by sqlc. DO NOT EDIT.
1126-
{{- range imports .SourceName}}
1127-
{{.}}
1128-
{{- end}}
1129-
1130-
{{range .Queries}}
1131-
{{- if $.OutputQuery .SourceName}}
1132-
{{.ConstantName}} = """-- name: {{.MethodName}} \\{{.Cmd}}
1133-
{{.SQL}}
1134-
"""
1135-
{{range .Args}}
1136-
{{- if .EmitStruct}}
1137-
1138-
@dataclasses.dataclass()
1139-
class {{.Type}}: {{- range .Struct.Fields}}
1140-
{{.Name}}: {{.Type}}
1141-
{{- end}}
1142-
{{end}}{{end}}
1143-
{{- if .Ret.EmitStruct}}
1144-
1145-
@dataclasses.dataclass()
1146-
class {{.Ret.Type}}: {{- range .Ret.Struct.Fields}}
1147-
{{.Name}}: {{.Type}}
1148-
{{- end}}
1149-
{{end}}
1150-
{{end}}
1151-
{{- end}}
1152-
1153-
{{- if .EmitSync}}
1154-
class Querier:
1155-
def __init__(self, conn: sqlalchemy.engine.Connection):
1156-
self._conn = conn
1157-
{{range .Queries}}
1158-
{{- if $.OutputQuery .SourceName}}
1159-
{{- if eq .Cmd ":one"}}
1160-
def {{.MethodName}}(self{{.ArgPairs}}) -> Optional[{{.Ret.Type}}]:
1161-
row = self._conn.execute(sqlalchemy.text({{.ConstantName}}){{.ArgDict}}).first()
1162-
if row is None:
1163-
return None
1164-
{{- if .Ret.IsStruct}}
1165-
return {{.Ret.StructRowParser "row" 8}}
1166-
{{- else}}
1167-
return row[0]
1168-
{{- end}}
1169-
{{end}}
1170-
1171-
{{- if eq .Cmd ":many"}}
1172-
def {{.MethodName}}(self{{.ArgPairs}}) -> Iterator[{{.Ret.Type}}]:
1173-
result = self._conn.execute(sqlalchemy.text({{.ConstantName}}){{.ArgDict}})
1174-
for row in result:
1175-
{{- if .Ret.IsStruct}}
1176-
yield {{.Ret.StructRowParser "row" 12}}
1177-
{{- else}}
1178-
yield row[0]
1179-
{{- end}}
1180-
{{end}}
1181-
1182-
{{- if eq .Cmd ":exec"}}
1183-
def {{.MethodName}}(self{{.ArgPairs}}) -> None:
1184-
self._conn.execute(sqlalchemy.text({{.ConstantName}}){{.ArgDict}})
1185-
{{end}}
1186-
1187-
{{- if eq .Cmd ":execrows"}}
1188-
def {{.MethodName}}(self{{.ArgPairs}}) -> int:
1189-
result = self._conn.execute(sqlalchemy.text({{.ConstantName}}){{.ArgDict}})
1190-
return result.rowcount
1191-
{{end}}
1192-
1193-
{{- if eq .Cmd ":execresult"}}
1194-
def {{.MethodName}}(self{{.ArgPairs}}) -> sqlalchemy.engine.Result:
1195-
return self._conn.execute(sqlalchemy.text({{.ConstantName}}){{.ArgDict}})
1196-
{{end}}
1197-
{{- end}}
1198-
{{- end}}
1199-
{{- end}}
1200-
1201-
{{- if .EmitAsync}}
1202-
1203-
class AsyncQuerier:
1204-
def __init__(self, conn: sqlalchemy.ext.asyncio.AsyncConnection):
1205-
self._conn = conn
1206-
{{range .Queries}}
1207-
{{- if $.OutputQuery .SourceName}}
1208-
{{- if eq .Cmd ":one"}}
1209-
async def {{.MethodName}}(self{{.ArgPairs}}) -> Optional[{{.Ret.Type}}]:
1210-
row = (await self._conn.execute(sqlalchemy.text({{.ConstantName}}){{.ArgDict}})).first()
1211-
if row is None:
1212-
return None
1213-
{{- if .Ret.IsStruct}}
1214-
return {{.Ret.StructRowParser "row" 8}}
1215-
{{- else}}
1216-
return row[0]
1217-
{{- end}}
1218-
{{end}}
1219-
1220-
{{- if eq .Cmd ":many"}}
1221-
async def {{.MethodName}}(self{{.ArgPairs}}) -> AsyncIterator[{{.Ret.Type}}]:
1222-
result = await self._conn.stream(sqlalchemy.text({{.ConstantName}}){{.ArgDict}})
1223-
async for row in result:
1224-
{{- if .Ret.IsStruct}}
1225-
yield {{.Ret.StructRowParser "row" 12}}
1226-
{{- else}}
1227-
yield row[0]
1228-
{{- end}}
1229-
{{end}}
1230-
1231-
{{- if eq .Cmd ":exec"}}
1232-
async def {{.MethodName}}(self{{.ArgPairs}}) -> None:
1233-
await self._conn.execute(sqlalchemy.text({{.ConstantName}}){{.ArgDict}})
1234-
{{end}}
1235-
1236-
{{- if eq .Cmd ":execrows"}}
1237-
async def {{.MethodName}}(self{{.ArgPairs}}) -> int:
1238-
result = await self._conn.execute(sqlalchemy.text({{.ConstantName}}){{.ArgDict}})
1239-
return result.rowcount
1240-
{{end}}
1241-
1242-
{{- if eq .Cmd ":execresult"}}
1243-
async def {{.MethodName}}(self{{.ArgPairs}}) -> sqlalchemy.engine.Result:
1244-
return await self._conn.execute(sqlalchemy.text({{.ConstantName}}){{.ArgDict}})
1245-
{{end}}
1246-
{{- end}}
1247-
{{- end}}
1248-
{{- end}}
1249-
`
1250-
12511035
type pyTmplCtx struct {
12521036
Models []Struct
12531037
Queries []Query

0 commit comments

Comments
 (0)