Skip to content

Commit e7295a4

Browse files
authored
Remove Param structs (#20)
* refactor(utils): remove unused ArgName function in ParamName (feature/remove-params-structs) * refactor(queries): remove unused parameter structs (feature/remove-params-structs) * refactor(models): simplify QueryValue struct in models.go (feature/remove-params-structs) * refactor: refactor goColumn struct to core.QueryValue struct (feature/remove-params-structs) * refactor: remove redundant struct field type check (feature/remove-params-structs) * feat(core): refactor queryValueModelImports to handle multiple arguments (feature/remove-params-structs) * refactor: refactor prepareFunctionHeader to handle multiple arguments (feature/remove-params-structs) * fix: Update python wasm sha256 in sqlc.yaml (feature/remove-params-structs) * feat(sqlite3): refactor SQLite3BuildPyQueryFunc for multiple arguments (feature/remove-params-structs) * refactor AioSQLiteBuildPyQueryFunc args signature (feature/remove-params-structs) * feat(codegen): update TypeBuildPyQueryFunc signature Adjust TypeBuildPyQueryFunc signature to accept an array of strings representing parameters. (feature/remove-params-structs) * fragment * fragment
1 parent 0e61771 commit e7295a4

12 files changed

Lines changed: 106 additions & 178 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Changed
2+
body: Query functions now dont take param-structs
3+
time: 2025-04-01T02:20:38.5896761+02:00
4+
custom:
5+
Author: rayakame
6+
PR: "20"

internal/builders.go

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -197,35 +197,29 @@ func (gen *PythonGenerator) buildQueries(tables []core.Table) ([]core.Query, err
197197

198198
if len(query.Params) == 1 && qpl != 0 {
199199
p := query.Params[0]
200-
gq.Arg = core.QueryValue{
200+
gq.Args = []core.QueryValue{{
201201
Name: core.Escape(core.ParamName(p)),
202202
DBName: p.Column.GetName(),
203203
Typ: gen.makePythonType(p.Column),
204204
Column: p.Column,
205-
}
205+
}}
206206
} else if len(query.Params) >= 1 {
207-
var cols []goColumn
207+
var values []core.QueryValue
208208
for _, p := range query.Params {
209-
cols = append(cols, goColumn{
210-
id: int(p.Number),
209+
values = append(values, core.QueryValue{
210+
Name: core.Escape(core.ParamName(p)),
211+
DBName: p.Column.GetName(),
212+
Typ: gen.makePythonType(p.Column),
211213
Column: p.Column,
212214
})
213215
}
214-
s, err := gen.columnsToStruct(gq.MethodName+"Params", cols, false)
215-
if err != nil {
216-
return nil, err
217-
}
218-
gq.Arg = core.QueryValue{
219-
Emit: true,
220-
Name: "arg",
221-
Table: s,
222-
}
216+
gq.Args = values
223217

224218
// if query params is 2, and query params limit is 4 AND this is a copyfrom, we still want to emit the query's model
225219
// otherwise we end up with a copyfrom using a struct without the struct definition
226-
if len(query.Params) <= qpl && query.Cmd != ":copyfrom" {
227-
gq.Arg.Emit = false
228-
}
220+
//if len(query.Params) <= qpl && query.Cmd != ":copyfrom" {
221+
// gq.Args.Emit = false
222+
//}
229223
}
230224

231225
if len(query.Columns) == 1 && query.Columns[0].EmbedTable == nil {

internal/codegen/common.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"github.com/rayakame/sqlc-gen-better-python/internal/core"
88
)
99

10-
type TypeBuildPyQueryFunc func(*core.Query, *builders.IndentStringBuilder, string, string, bool) error
10+
type TypeBuildPyQueryFunc func(*core.Query, *builders.IndentStringBuilder, []string, string, bool) error
1111
type TypeAcceptedDriverCMDs func() []string
1212

1313
type Driver struct {

internal/codegen/drivers/aiosqlite.go

Lines changed: 25 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010

1111
const AioSQLiteConn = "aiosqlite.Connection"
1212

13-
func AioSQLiteBuildPyQueryFunc(query *core.Query, body *builders.IndentStringBuilder, argType string, retType string, isClass bool) error {
13+
func AioSQLiteBuildPyQueryFunc(query *core.Query, body *builders.IndentStringBuilder, args []string, retType string, isClass bool) error {
1414
indentLevel := 0
1515
params := fmt.Sprintf("conn: %s", AioSQLiteConn)
1616
conn := "conn"
@@ -20,73 +20,36 @@ func AioSQLiteBuildPyQueryFunc(query *core.Query, body *builders.IndentStringBui
2020
indentLevel = 1
2121
}
2222
body.WriteIndentedString(indentLevel, fmt.Sprintf("async def %s(%s", query.FuncName, params))
23-
if argType != "" {
24-
body.WriteString(fmt.Sprintf(", %s: %s", query.Arg.Name, argType))
23+
for i, arg := range args {
24+
if i == 0 {
25+
body.WriteString(", *")
26+
}
27+
body.WriteString(fmt.Sprintf(", %s", arg))
2528
}
2629
if query.Cmd == metadata.CmdExec {
2730
body.WriteLine(fmt.Sprintf(") -> %s:", retType))
2831
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("await %s.execute(%s", conn, query.ConstantName))
29-
if argType != "" {
30-
if query.Arg.IsStruct() {
31-
for _, col := range query.Arg.Table.Columns {
32-
body.WriteString(fmt.Sprintf(", %s.%s", query.Arg.Name, col.Name))
33-
}
34-
} else {
35-
body.WriteString(fmt.Sprintf(", %s", query.Arg.Name))
36-
}
37-
}
32+
aiosqliteWriteParams(query, body)
3833
body.WriteLine(")")
3934
} else if query.Cmd == metadata.CmdExecResult {
4035
body.WriteLine(fmt.Sprintf(") -> %s:", "aiosqlite.Cursor"))
4136
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("await %s.execute(%s", conn, query.ConstantName))
42-
if argType != "" {
43-
if query.Arg.IsStruct() {
44-
for _, col := range query.Arg.Table.Columns {
45-
body.WriteString(fmt.Sprintf(", %s.%s", query.Arg.Name, col.Name))
46-
}
47-
} else {
48-
body.WriteString(fmt.Sprintf(", %s", query.Arg.Name))
49-
}
50-
}
37+
aiosqliteWriteParams(query, body)
5138
body.WriteLine(")")
5239
} else if query.Cmd == metadata.CmdExecRows {
5340
body.WriteLine(fmt.Sprintf(") -> %s:", retType))
5441
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("await %s.execute(%s", conn, query.ConstantName))
55-
if argType != "" {
56-
if query.Arg.IsStruct() {
57-
for _, col := range query.Arg.Table.Columns {
58-
body.WriteString(fmt.Sprintf(", %s.%s", query.Arg.Name, col.Name))
59-
}
60-
} else {
61-
body.WriteString(fmt.Sprintf(", %s", query.Arg.Name))
62-
}
63-
}
42+
aiosqliteWriteParams(query, body)
6443
body.WriteLine(").rowcount")
6544
} else if query.Cmd == metadata.CmdExecLastId {
6645
body.WriteLine(fmt.Sprintf(") -> %s:", retType))
6746
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("await %s.execute(%s", conn, query.ConstantName))
68-
if argType != "" {
69-
if query.Arg.IsStruct() {
70-
for _, col := range query.Arg.Table.Columns {
71-
body.WriteString(fmt.Sprintf(", %s.%s", query.Arg.Name, col.Name))
72-
}
73-
} else {
74-
body.WriteString(fmt.Sprintf(", %s", query.Arg.Name))
75-
}
76-
}
47+
aiosqliteWriteParams(query, body)
7748
body.WriteLine(").lastrowid")
7849
} else if query.Cmd == metadata.CmdOne {
7950
body.WriteLine(fmt.Sprintf(") -> typing.Optional[%s]:", retType))
8051
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("row = await (await %s.execute(%s", conn, query.ConstantName))
81-
if argType != "" {
82-
if query.Arg.IsStruct() {
83-
for _, col := range query.Arg.Table.Columns {
84-
body.WriteString(fmt.Sprintf(", %s.%s", query.Arg.Name, col.Name))
85-
}
86-
} else {
87-
body.WriteString(fmt.Sprintf(", %s", query.Arg.Name))
88-
}
89-
}
52+
aiosqliteWriteParams(query, body)
9053
body.WriteLine(")).fetchone()")
9154
body.WriteIndentedLine(indentLevel+1, "if row is None:")
9255
body.WriteIndentedLine(indentLevel+2, "return None")
@@ -105,15 +68,7 @@ func AioSQLiteBuildPyQueryFunc(query *core.Query, body *builders.IndentStringBui
10568
} else if query.Cmd == metadata.CmdMany {
10669
body.WriteLine(fmt.Sprintf(") -> typing.AsyncIterator[%s]:", retType))
10770
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("stream = await %s.execute(%s", conn, query.ConstantName))
108-
if argType != "" {
109-
if query.Arg.IsStruct() {
110-
for _, col := range query.Arg.Table.Columns {
111-
body.WriteString(fmt.Sprintf(", %s.%s", query.Arg.Name, col.Name))
112-
}
113-
} else {
114-
body.WriteString(fmt.Sprintf(", %s", query.Arg.Name))
115-
}
116-
}
71+
aiosqliteWriteParams(query, body)
11772
body.WriteLine(")")
11873
body.WriteIndentedLine(indentLevel+1, "async for row in stream:")
11974
if query.Ret.IsStruct() {
@@ -142,3 +97,16 @@ func AioSQLiteAcceptedDriverCMDs() []string {
14297
metadata.CmdMany,
14398
}
14499
}
100+
101+
func aiosqliteWriteParams(query *core.Query, body *builders.IndentStringBuilder) {
102+
if len(query.Args) == 0 {
103+
return
104+
}
105+
params := "("
106+
for _, arg := range query.Args {
107+
if !arg.IsEmpty() {
108+
params += fmt.Sprintf("%s, ", arg.Name)
109+
}
110+
}
111+
body.WriteString("," + params + ")")
112+
}

internal/codegen/drivers/sqlite3.go

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010

1111
const SQLite3Conn = "sqlite3.Connection"
1212

13-
func SQLite3BuildPyQueryFunc(query *core.Query, body *builders.IndentStringBuilder, argType string, retType string, isClass bool) error {
13+
func SQLite3BuildPyQueryFunc(query *core.Query, body *builders.IndentStringBuilder, args []string, retType string, isClass bool) error {
1414
indentLevel := 0
1515
params := fmt.Sprintf("conn: %s", SQLite3Conn)
1616
conn := "conn"
@@ -20,33 +20,36 @@ func SQLite3BuildPyQueryFunc(query *core.Query, body *builders.IndentStringBuild
2020
indentLevel = 1
2121
}
2222
body.WriteIndentedString(indentLevel, fmt.Sprintf("def %s(%s", query.FuncName, params))
23-
if argType != "" {
24-
body.WriteString(fmt.Sprintf(", %s: %s", query.Arg.Name, argType))
23+
for i, arg := range args {
24+
if i == 0 {
25+
body.WriteString(", *")
26+
}
27+
body.WriteString(fmt.Sprintf(", %s", arg))
2528
}
2629
if query.Cmd == metadata.CmdExec {
2730
body.WriteLine(fmt.Sprintf(") -> %s:", retType))
2831
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("%s.execute(%s", conn, query.ConstantName))
29-
writeParams(query, body, argType)
32+
sqlite3WriteParams(query, body)
3033
body.WriteLine(")")
3134
} else if query.Cmd == metadata.CmdExecResult {
3235
body.WriteLine(fmt.Sprintf(") -> %s:", "sqlite3.Cursor"))
3336
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("%s.execute(%s", conn, query.ConstantName))
34-
writeParams(query, body, argType)
37+
sqlite3WriteParams(query, body)
3538
body.WriteLine(")")
3639
} else if query.Cmd == metadata.CmdExecRows {
3740
body.WriteLine(fmt.Sprintf(") -> %s:", retType))
3841
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("%s.execute(%s", conn, query.ConstantName))
39-
writeParams(query, body, argType)
42+
sqlite3WriteParams(query, body)
4043
body.WriteLine(").rowcount")
4144
} else if query.Cmd == metadata.CmdExecLastId {
4245
body.WriteLine(fmt.Sprintf(") -> %s:", retType))
4346
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("%s.execute(%s", conn, query.ConstantName))
44-
writeParams(query, body, argType)
47+
sqlite3WriteParams(query, body)
4548
body.WriteLine(").lastrowid")
4649
} else if query.Cmd == metadata.CmdOne {
4750
body.WriteLine(fmt.Sprintf(") -> typing.Optional[%s]:", retType))
4851
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("row = %s.execute(%s", conn, query.ConstantName))
49-
writeParams(query, body, argType)
52+
sqlite3WriteParams(query, body)
5053
body.WriteLine(").fetchone()")
5154
body.WriteIndentedLine(indentLevel+1, "if row is None:")
5255
body.WriteIndentedLine(indentLevel+2, "return None")
@@ -66,7 +69,7 @@ func SQLite3BuildPyQueryFunc(query *core.Query, body *builders.IndentStringBuild
6669
body.WriteLine(fmt.Sprintf(") -> typing.List[%s]:", retType))
6770
body.WriteIndentedLine(indentLevel+1, fmt.Sprintf("rows: typing.List[%s] = []", retType))
6871
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("for row in %s.execute(%s", conn, query.ConstantName))
69-
writeParams(query, body, argType)
72+
sqlite3WriteParams(query, body)
7073
body.WriteLine(").fetchall():")
7174
if query.Ret.IsStruct() {
7275
body.WriteIndentedString(indentLevel+2, fmt.Sprintf("rows.append(%s(", retType))
@@ -96,16 +99,19 @@ func SQLite3AcceptedDriverCMDs() []string {
9699
}
97100
}
98101

99-
func writeParams(query *core.Query, body *builders.IndentStringBuilder, argType string) {
100-
if argType != "" {
101-
params := "("
102-
if query.Arg.IsStruct() {
103-
for _, col := range query.Arg.Table.Columns {
104-
params += fmt.Sprintf("%s.%s, ", query.Arg.Name, col.Name)
102+
func sqlite3WriteParams(query *core.Query, body *builders.IndentStringBuilder) {
103+
if len(query.Args) == 0 {
104+
return
105+
}
106+
params := "("
107+
for i, arg := range query.Args {
108+
if !arg.IsEmpty() {
109+
if i == len(query.Args)-1 && i != 0 {
110+
params += fmt.Sprintf("%s", arg.Name)
111+
} else {
112+
params += fmt.Sprintf("%s, ", arg.Name)
105113
}
106-
} else {
107-
params += fmt.Sprintf("%s, ", query.Arg.Name)
108114
}
109-
body.WriteString("," + params + ")")
110115
}
116+
body.WriteString("," + params + ")")
111117
}

internal/codegen/queries.go

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,16 @@ import (
1010
"strings"
1111
)
1212

13-
func (dr *Driver) prepareFunctionHeader(query *core.Query, body *builders.IndentStringBuilder) (string, string, []string) {
13+
func (dr *Driver) prepareFunctionHeader(query *core.Query, body *builders.IndentStringBuilder) ([]string, string, []string) {
1414
pyTableNames := make([]string, 0)
15-
argType := ""
16-
if query.Arg.EmitStruct() && query.Arg.IsStruct() {
17-
BuildPyTabel(dr.conf.ModelType, query.Arg.Table, body)
18-
body.WriteString("\n\n")
19-
argType = query.Arg.Table.Name
20-
pyTableNames = append(pyTableNames, query.Arg.Table.Name)
21-
} else if !query.Arg.IsEmpty() {
22-
argType = query.Arg.Typ.Type
23-
if query.Arg.Typ.IsList {
24-
argType = fmt.Sprintf("typing.Sequence[%s]", argType)
15+
args := make([]string, 0)
16+
for _, arg := range query.Args {
17+
if !arg.IsEmpty() {
18+
argType := arg.Typ.Type
19+
if arg.Typ.IsList {
20+
argType = fmt.Sprintf("typing.Sequence[%s]", argType)
21+
}
22+
args = append(args, fmt.Sprintf("%s: %s", arg.Name, argType))
2523
}
2624
}
2725
retType := "None"
@@ -40,7 +38,7 @@ func (dr *Driver) prepareFunctionHeader(query *core.Query, body *builders.Indent
4038
if query.Cmd == metadata.CmdExecLastId || query.Cmd == metadata.CmdExecRows {
4139
retType = "int"
4240
}
43-
return argType, retType, pyTableNames
41+
return args, retType, pyTableNames
4442
}
4543

4644
func (dr *Driver) BuildPyQueriesFiles(imp *core.Importer, queries []core.Query) ([]*plugin.File, error) {
@@ -113,9 +111,9 @@ func (dr *Driver) buildPyQueriesFile(imp *core.Importer, queries []core.Query, s
113111
allNames = append(allNames, dr.buildClassTemplate(sourceName, funcBody))
114112
}
115113
for i, query := range queries {
116-
argType, retType, addedPyTableNames := dr.prepareFunctionHeader(&query, pyTableBody)
114+
args, retType, addedPyTableNames := dr.prepareFunctionHeader(&query, pyTableBody)
117115
allNames = append(allNames, addedPyTableNames...)
118-
err := dr.buildPyQueryFunc(&query, funcBody, argType, retType, dr.conf.EmitClasses)
116+
err := dr.buildPyQueryFunc(&query, funcBody, args, retType, dr.conf.EmitClasses)
119117
if err != nil {
120118
return nil, err
121119
}

internal/core/importer.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,10 @@ func (i *Importer) queryImportSpecs(fileName string) (map[string]importSpec, map
116116
if queryValueUses(name, q.Ret) {
117117
return true
118118
}
119-
if queryValueUses(name, q.Arg) {
120-
return true
119+
for _, arg := range q.Args {
120+
if queryValueUses(name, arg) {
121+
return true
122+
}
121123
}
122124
}
123125
return false
@@ -143,7 +145,6 @@ func (i *Importer) queryImportSpecs(fileName string) (map[string]importSpec, map
143145
// continue
144146
//}
145147
queryValueModelImports(q.Ret)
146-
queryValueModelImports(q.Arg)
147148
}
148149

149150
loc["models"] = importSpec{Module: i.C.Package, Name: "models"}

internal/core/models.go

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,11 @@ func EnumReplace(value string) string {
5151
}
5252

5353
type QueryValue struct {
54-
Emit bool
55-
EmitPointer bool
56-
Name string
57-
DBName string // The name of the field in the database. Only set if Struct==nil.
58-
Table *Table
59-
Typ PyType
54+
Emit bool
55+
Name string
56+
DBName string // The name of the field in the database. Only set if Struct==nil.
57+
Table *Table
58+
Typ PyType
6059

6160
// Column is kept so late in the generation process around to differentiate
6261
// between mysql slices and pg arrays
@@ -71,10 +70,6 @@ func (v QueryValue) IsStruct() bool {
7170
return v.Table != nil
7271
}
7372

74-
func (v QueryValue) IsPointer() bool {
75-
return v.EmitPointer && v.Table != nil
76-
}
77-
7873
func (v QueryValue) IsEmpty() bool {
7974
return v.Typ.Type == "" && v.Name == "" && v.Table == nil
8075
}
@@ -99,7 +94,8 @@ type Query struct {
9994
SQL string
10095
SourceName string
10196
Ret QueryValue
102-
Arg QueryValue
97+
Args []QueryValue
98+
10399
// Used for :copyfrom
104100
Table *plugin.Identifier
105101
}

0 commit comments

Comments
 (0)