@@ -37,17 +37,6 @@ type pyType struct {
37
37
IsNull bool
38
38
}
39
39
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
-
51
40
func (t pyType ) Annotation () * pyast.Node {
52
41
ann := poet .Name (t .InnerType )
53
42
if t .IsArray {
@@ -105,40 +94,6 @@ func (v QueryValue) isEmpty() bool {
105
94
return v .Typ == (pyType {}) && v .Name == "" && v .Struct == nil
106
95
}
107
96
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
-
142
97
func (v QueryValue ) RowNode (rowVar string ) * pyast.Node {
143
98
if ! v .IsStruct () {
144
99
return subscriptNode (
@@ -178,21 +133,6 @@ type Query struct {
178
133
Args []QueryValue
179
134
}
180
135
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
-
196
136
func (q Query ) AddArgs (args * pyast.Arguments ) {
197
137
// A single struct arg does not need to be passed as a keyword argument
198
138
if len (q .Args ) == 1 && q .Args [0 ].IsStruct () {
@@ -210,32 +150,6 @@ func (q Query) AddArgs(args *pyast.Arguments) {
210
150
}
211
151
}
212
152
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
-
239
153
func (q Query ) ArgDictNode () * pyast.Node {
240
154
dict := & pyast.Dict {}
241
155
i := 1
@@ -914,15 +828,15 @@ func buildQueryTree(ctx *pyTmplCtx, i *importer, source string) *pyast.Node {
914
828
mod .Body = append (mod .Body , assignNode (q .ConstantName , poet .Constant (queryText )))
915
829
for _ , arg := range q .Args {
916
830
if arg .EmitStruct () {
917
- def := dataclassNode (arg .Type () )
831
+ def := dataclassNode (arg .Struct . Name )
918
832
for _ , f := range arg .Struct .Fields {
919
833
def .Body = append (def .Body , fieldNode (f ))
920
834
}
921
835
mod .Body = append (mod .Body , poet .Node (def ))
922
836
}
923
837
}
924
838
if q .Ret .EmitStruct () {
925
- def := dataclassNode (q .Ret .Type () )
839
+ def := dataclassNode (q .Ret .Struct . Name )
926
840
for _ , f := range q .Ret .Struct .Fields {
927
841
def .Body = append (def .Body , fieldNode (f ))
928
842
}
@@ -1118,136 +1032,6 @@ func buildQueryTree(ctx *pyTmplCtx, i *importer, source string) *pyast.Node {
1118
1032
return poet .Node (mod )
1119
1033
}
1120
1034
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
-
1251
1035
type pyTmplCtx struct {
1252
1036
Models []Struct
1253
1037
Queries []Query
0 commit comments