@@ -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-
5140func (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-
14297func (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-
196136func (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-
239153func (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-
12511035type pyTmplCtx struct {
12521036 Models []Struct
12531037 Queries []Query
0 commit comments