Skip to content

Commit a1c9ed9

Browse files
authored
Merge pull request #591 from go-jet/dev
Fix for SQLite INTEGER and REAL types are generated as int32 and floa…
2 parents b30d7c5 + 0ba4561 commit a1c9ed9

16 files changed

Lines changed: 164 additions & 50 deletions

File tree

examples/go.mod

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module github.com/go-jet/jet/v2/examples
2+
3+
go 1.24.0
4+
5+
require (
6+
github.com/go-jet/jet/v2 v2.14.1
7+
github.com/lib/pq v1.12.3
8+
)
9+
10+
require (
11+
github.com/davecgh/go-spew v1.1.1 // indirect
12+
github.com/google/uuid v1.6.0 // indirect
13+
github.com/kr/text v0.2.0 // indirect
14+
github.com/pmezard/go-difflib v1.0.0 // indirect
15+
github.com/stretchr/testify v1.11.1 // indirect
16+
gopkg.in/yaml.v3 v3.0.1 // indirect
17+
)
18+
19+
replace github.com/go-jet/jet/v2 => ../

examples/quick-start/quick-start.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func main() {
7575
panicOnError(err)
7676

7777
printStatementInfo(stmt)
78-
jsonSave("./dest.json", dest)
78+
jsonSave("./quick-start/dest.json", dest)
7979

8080
// New Destination
8181

@@ -89,7 +89,7 @@ func main() {
8989
err = stmt.Query(db, &dest2)
9090
panicOnError(err)
9191

92-
jsonSave("./dest2.json", dest2)
92+
jsonSave("./quick-start/dest2.json", dest2)
9393
}
9494

9595
func jsonSave(path string, v interface{}) {

generator/metadata/column_meta_data.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ const (
2424

2525
// DataType contains information about column data type
2626
type DataType struct {
27-
Name string
28-
Kind DataTypeKind
29-
IsUnsigned bool
30-
Dimensions int // The number of array dimensions
27+
Name string
28+
Kind DataTypeKind
29+
IsUnsigned bool
30+
Dimensions int // The number of array dimensions
31+
SourceDialect string
3132
}
3233

3334
func (d DataType) IsArray() bool {

generator/mysql/query_set.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"strings"
88

99
"github.com/go-jet/jet/v2/generator/metadata"
10+
mysqldialect "github.com/go-jet/jet/v2/mysql"
1011
"github.com/go-jet/jet/v2/qrm"
1112
)
1213

@@ -30,7 +31,8 @@ SELECT
3031
) AS "dataType.Name",
3132
IF (col.DATA_TYPE = 'enum', 'enum', 'base') AS "dataType.Kind",
3233
col.COLUMN_TYPE LIKE '%unsigned%' AS "dataType.IsUnsigned",
33-
col.EXTRA LIKE '%VIRTUAL GENERATED%' AS "column.isGenerated"
34+
col.EXTRA LIKE '%VIRTUAL GENERATED%' AS "column.isGenerated",
35+
? AS "dataType.SourceDialect"
3436
FROM INFORMATION_SCHEMA.tables AS t
3537
INNER JOIN
3638
information_schema.columns AS col
@@ -51,7 +53,7 @@ ORDER BY
5153

5254
var tables []metadata.Table
5355

54-
_, err := qrm.Query(context.Background(), db, query, []interface{}{schemaName, schemaName, tableType}, &tables)
56+
_, err := qrm.Query(context.Background(), db, query, []interface{}{mysqldialect.Dialect.Name(), schemaName, schemaName, tableType}, &tables)
5557
if err != nil {
5658
return nil, fmt.Errorf("failed to query column meta data: %w", err)
5759
}

generator/postgres/query_set.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77

88
"github.com/go-jet/jet/v2/generator/metadata"
9+
postgresdialect "github.com/go-jet/jet/v2/postgres"
910
"github.com/go-jet/jet/v2/qrm"
1011
)
1112

@@ -79,7 +80,8 @@ select
7980
when tp.typcategory = 'A' then elem.typname
8081
else tp.typname
8182
end) as "dataType.Name",
82-
false as "dataType.isUnsigned"
83+
false as "dataType.isUnsigned",
84+
$3::text as "dataType.SourceDialect"
8385
from pg_catalog.pg_attribute as attr
8486
join pg_catalog.pg_class as cls on cls.oid = attr.attrelid
8587
join pg_catalog.pg_namespace as ns on ns.oid = cls.relnamespace
@@ -94,7 +96,7 @@ order by
9496
attr.attnum;
9597
`
9698
var columns []metadata.Column
97-
_, err := qrm.Query(context.Background(), db, query, []interface{}{schemaName, tableName}, &columns)
99+
_, err := qrm.Query(context.Background(), db, query, []interface{}{schemaName, tableName, postgresdialect.Dialect.Name()}, &columns)
98100
if err != nil {
99101
return nil, fmt.Errorf("failed to query '%s' columns metadata: %w", tableName, err)
100102
}

generator/sqlite/query_set.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/go-jet/jet/v2/generator/metadata"
1010
"github.com/go-jet/jet/v2/internal/utils/semantic"
1111
"github.com/go-jet/jet/v2/qrm"
12+
sqlitedialect "github.com/go-jet/jet/v2/sqlite"
1213
)
1314

1415
// sqliteQuerySet is dialect query set for SQLite
@@ -102,9 +103,10 @@ func (p sqliteQuerySet) GetTableColumnsMetaData(db *sql.DB, schemaName string, t
102103
IsGenerated: isGenerated,
103104
HasDefault: hasDefault,
104105
DataType: metadata.DataType{
105-
Name: columnType,
106-
Kind: metadata.BaseType,
107-
IsUnsigned: false,
106+
Name: columnType,
107+
Kind: metadata.BaseType,
108+
IsUnsigned: false,
109+
SourceDialect: sqlitedialect.Dialect.Name(),
108110
},
109111
})
110112
}

generator/template/model_template.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,8 +318,18 @@ func toGoArrayType(elemType any, column metadata.Column) any {
318318

319319
// toGoType returns model type for column info.
320320
func toGoType(column metadata.Column) interface{} {
321+
dataTypeName := strings.ToLower(column.DataType.Name)
322+
323+
if column.DataType.SourceDialect == "SQLite" {
324+
switch dataTypeName {
325+
case "integer", "int":
326+
return int64(0)
327+
case "real":
328+
return float64(0.0)
329+
}
330+
}
321331

322-
switch strings.ToLower(column.DataType.Name) {
332+
switch dataTypeName {
323333
case "user-defined", "enum":
324334
return ""
325335
case "boolean", "bool":

generator/template/model_template_test.go

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package template
22

33
import (
4+
"testing"
5+
46
"github.com/go-jet/jet/v2/generator/metadata"
57
"github.com/stretchr/testify/require"
6-
"testing"
78
)
89

9-
func Test_TableModelField(t *testing.T) {
10+
func TestTableModelField(t *testing.T) {
1011
require.Equal(t, DefaultTableModelField(metadata.Column{
1112
Name: "col_name",
1213
IsPrimaryKey: true,
@@ -43,3 +44,80 @@ func Test_TableModelField(t *testing.T) {
4344
Tags: nil,
4445
})
4546
}
47+
48+
func TestTableModelFieldSourceDialect(t *testing.T) {
49+
testCases := []struct {
50+
name string
51+
dataTypeName string
52+
sourceDialect string
53+
isNullable bool
54+
expectedType string
55+
}{
56+
{
57+
name: "sqlite integer",
58+
dataTypeName: "INTEGER",
59+
sourceDialect: "SQLite",
60+
expectedType: "int64",
61+
},
62+
{
63+
name: "sqlite int",
64+
dataTypeName: "INT",
65+
sourceDialect: "SQLite",
66+
expectedType: "int64",
67+
},
68+
{
69+
name: "sqlite nullable integer",
70+
dataTypeName: "INTEGER",
71+
sourceDialect: "SQLite",
72+
isNullable: true,
73+
expectedType: "*int64",
74+
},
75+
{
76+
name: "sqlite real",
77+
dataTypeName: "REAL",
78+
sourceDialect: "SQLite",
79+
expectedType: "float64",
80+
},
81+
{
82+
name: "sqlite nullable real",
83+
dataTypeName: "REAL",
84+
sourceDialect: "SQLite",
85+
isNullable: true,
86+
expectedType: "*float64",
87+
},
88+
{
89+
name: "postgres integer",
90+
dataTypeName: "integer",
91+
sourceDialect: "PostgreSQL",
92+
expectedType: "int32",
93+
},
94+
{
95+
name: "postgres real",
96+
dataTypeName: "real",
97+
sourceDialect: "PostgreSQL",
98+
expectedType: "float32",
99+
},
100+
{
101+
name: "mysql int",
102+
dataTypeName: "int",
103+
sourceDialect: "MySQL",
104+
expectedType: "int32",
105+
},
106+
}
107+
108+
for _, testCase := range testCases {
109+
t.Run(testCase.name, func(t *testing.T) {
110+
field := DefaultTableModelField(metadata.Column{
111+
Name: "field",
112+
IsNullable: testCase.isNullable,
113+
DataType: metadata.DataType{
114+
Name: testCase.dataTypeName,
115+
Kind: metadata.BaseType,
116+
SourceDialect: testCase.sourceDialect,
117+
},
118+
})
119+
120+
require.Equal(t, testCase.expectedType, field.Type.Name)
121+
})
122+
}
123+
}

tests/mysql/generator_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ func TestGenerator_TableMetadata(t *testing.T) {
6565
want := metadata.Table{
6666
Name: "actor",
6767
Columns: []metadata.Column{
68-
{Name: "actor_id", IsPrimaryKey: true, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "smallint", Kind: "base", IsUnsigned: true}, Comment: ""},
69-
{Name: "first_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false}, Comment: ""},
70-
{Name: "last_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false}, Comment: ""},
71-
{Name: "last_update", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: true, DataType: metadata.DataType{Name: "timestamp", Kind: "base", IsUnsigned: false}, Comment: ""},
68+
{Name: "actor_id", IsPrimaryKey: true, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "smallint", Kind: "base", IsUnsigned: true, SourceDialect: "MySQL"}, Comment: ""},
69+
{Name: "first_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false, SourceDialect: "MySQL"}, Comment: ""},
70+
{Name: "last_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false, SourceDialect: "MySQL"}, Comment: ""},
71+
{Name: "last_update", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: true, DataType: metadata.DataType{Name: "timestamp", Kind: "base", IsUnsigned: false, SourceDialect: "MySQL"}, Comment: ""},
7272
},
7373
}
7474
require.Equal(t, want, got)

tests/postgres/generator_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,10 @@ func TestGenerator_TableMetadata(t *testing.T) {
313313
want := metadata.Table{
314314
Name: "actor",
315315
Columns: []metadata.Column{
316-
{Name: "actor_id", IsPrimaryKey: true, IsNullable: false, IsGenerated: false, HasDefault: true, DataType: metadata.DataType{Name: "int4", Kind: "base", IsUnsigned: false}, Comment: ""},
317-
{Name: "first_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false}, Comment: ""},
318-
{Name: "last_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false}, Comment: ""},
319-
{Name: "last_update", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "timestamp", Kind: "base", IsUnsigned: false}, Comment: ""},
316+
{Name: "actor_id", IsPrimaryKey: true, IsNullable: false, IsGenerated: false, HasDefault: true, DataType: metadata.DataType{Name: "int4", Kind: "base", IsUnsigned: false, SourceDialect: "PostgreSQL"}, Comment: ""},
317+
{Name: "first_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false, SourceDialect: "PostgreSQL"}, Comment: ""},
318+
{Name: "last_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false, SourceDialect: "PostgreSQL"}, Comment: ""},
319+
{Name: "last_update", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "timestamp", Kind: "base", IsUnsigned: false, SourceDialect: "PostgreSQL"}, Comment: ""},
320320
},
321321
}
322322
require.Equal(t, want, got)

0 commit comments

Comments
 (0)