Skip to content

Commit 846cddb

Browse files
committed
added information.ColumnExists
1 parent 73d66ae commit 846cddb

File tree

9 files changed

+207
-162
lines changed

9 files changed

+207
-162
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.18
44

55
require (
66
github.com/domonda/go-errs v0.0.0-20220429185920-b85918b964f9
7-
github.com/domonda/go-types v0.0.0-20220513100758-7818d7fcb7bb
7+
github.com/domonda/go-types v0.0.0-20220525115110-58b4488326ea
88
github.com/go-sql-driver/mysql v1.6.0
99
github.com/lib/pq v1.10.6
1010
github.com/stretchr/testify v1.7.1

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ github.com/domonda/go-pretty v0.0.0-20220317123925-dd9e6bef129a h1:6/Is0KGl5Ot3E
77
github.com/domonda/go-pretty v0.0.0-20220317123925-dd9e6bef129a/go.mod h1:3QkM8UJdyJMeKZiIo7hYzSkQBpRS3k0gOHw4ysyEIB4=
88
github.com/domonda/go-types v0.0.0-20220513100758-7818d7fcb7bb h1:/+ltgjE+3/CrcxBxij/4sJgg9EXjGb733wqkTGifhDY=
99
github.com/domonda/go-types v0.0.0-20220513100758-7818d7fcb7bb/go.mod h1:9+VXi/vJHmCp2Nl/hQB+UtJbPA8aUWAfAulGX86i1EA=
10+
github.com/domonda/go-types v0.0.0-20220525115110-58b4488326ea h1:ISVN1HhZvofNGK+DrGr/OHN4Z+4vgbD5jZbbFBdibPQ=
11+
github.com/domonda/go-types v0.0.0-20220525115110-58b4488326ea/go.mod h1:qZTRjdjIXo3g+8PUhfpkKbMPGsLVTuF3H7/AX5CzNeQ=
1012
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
1113
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
1214
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=

information/checkconstraints.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package information
2+
3+
type CheckConstraints struct {
4+
ConstraintCatalog String `db:"constraint_catalog"`
5+
ConstraintSchema String `db:"constraint_schema"`
6+
ConstraintName String `db:"constraint_name"`
7+
CheckClause String `db:"check_clause"`
8+
}

information/column.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package information
2+
3+
import (
4+
"context"
5+
"strings"
6+
7+
"github.com/domonda/go-errs"
8+
"github.com/domonda/go-sqldb/db"
9+
)
10+
11+
type Column struct {
12+
TableCatalog String `db:"table_catalog"`
13+
TableSchema String `db:"table_schema"`
14+
TableName String `db:"table_name"`
15+
ColumnName String `db:"column_name"`
16+
OrdinalPosition int `db:"ordinal_position"`
17+
ColumnDefault String `db:"column_default"`
18+
IsNullable YesNo `db:"is_nullable"`
19+
DataType String `db:"data_type"`
20+
CharacterMaximumLength *int `db:"character_maximum_length"`
21+
CharacterOctetLength *int `db:"character_octet_length"`
22+
NumericPrecision *int `db:"numeric_precision"`
23+
NumericPrecisionRadix *int `db:"numeric_precision_radix"`
24+
NumericScale *int `db:"numeric_scale"`
25+
DatetimePrecision *int `db:"datetime_precision"`
26+
IntervalType String `db:"interval_type"`
27+
IntervalPrecision *int `db:"interval_precision"`
28+
CharacterSetCatalog String `db:"character_set_catalog"`
29+
CharacterSetSchema String `db:"character_set_schema"`
30+
CharacterSetName String `db:"character_set_name"`
31+
CollationCatalog String `db:"collation_catalog"`
32+
CollationSchema String `db:"collation_schema"`
33+
CollationName String `db:"collation_name"`
34+
DomainCatalog String `db:"domain_catalog"`
35+
DomainSchema String `db:"domain_schema"`
36+
DomainName String `db:"domain_name"`
37+
UDTCatalog String `db:"udt_catalog"`
38+
UDTSchema String `db:"udt_schema"`
39+
UDTName String `db:"udt_name"`
40+
ScopeCatalog String `db:"scope_catalog"`
41+
ScopeSchema String `db:"scope_schema"`
42+
ScopeName String `db:"scope_name"`
43+
MaximumCardinality *int `db:"maximum_cardinality"`
44+
DTDIdentifier String `db:"dtd_identifier"`
45+
IsSelfReferencing YesNo `db:"is_self_referencing"`
46+
IsIdentity YesNo `db:"is_identity"`
47+
IdentityGeneration String `db:"identity_generation"`
48+
IdentityStart String `db:"identity_start"`
49+
IdentityIncrement String `db:"identity_increment"`
50+
IdentityMaximum String `db:"identity_maximum"`
51+
IdentityMinimum String `db:"identity_minimum"`
52+
IdentityCycle YesNo `db:"identity_cycle"`
53+
IsGenerated String `db:"is_generated"`
54+
GenerationExpression String `db:"generation_expression"`
55+
IsUpdatable YesNo `db:"is_updatable"`
56+
}
57+
58+
type KeyColumnUsage struct {
59+
ConstraintCatalog String `db:"constraint_catalog"`
60+
ConstraintSchema String `db:"constraint_schema"`
61+
ConstraintName String `db:"constraint_name"`
62+
TableCatalog String `db:"table_catalog"`
63+
TableSchema String `db:"table_schema"`
64+
TableName String `db:"table_name"`
65+
ColumnName String `db:"column_name"`
66+
OrdinalPosition int `db:"ordinal_position"`
67+
PositionInUniqueConstraint *int `db:"position_in_unique_constraint"`
68+
}
69+
70+
func ColumnExists(ctx context.Context, table, column string) (exists bool, err error) {
71+
defer errs.WrapWithFuncParams(&err, ctx, table, column)
72+
73+
tableSchema, tableName, ok := strings.Cut(table, ".")
74+
if !ok {
75+
tableSchema = "public"
76+
tableName = table
77+
}
78+
79+
err = db.Conn(ctx).QueryRow(
80+
`select exists(
81+
select from information_schema.columns
82+
where table_schema = $1
83+
and table_name = $2
84+
and column_name = $3
85+
)`,
86+
tableSchema,
87+
tableName,
88+
column,
89+
).Scan(&exists)
90+
if err != nil {
91+
return false, err
92+
}
93+
return exists, nil
94+
}

information/domain.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package information
2+
3+
type Domain struct {
4+
DomainCatalog String `db:"domain_catalog"`
5+
DomainSchema String `db:"domain_schema"`
6+
DomainName String `db:"domain_name"`
7+
DataType String `db:"data_type"`
8+
CharacterMaximumLength *int `db:"character_maximum_length"`
9+
CharacterOctetLength *int `db:"character_octet_length"`
10+
CharacterSetCatalog String `db:"character_set_catalog"`
11+
CharacterSetSchema String `db:"character_set_schema"`
12+
CharacterSetName String `db:"character_set_name"`
13+
CollationCatalog String `db:"collation_catalog"`
14+
CollationSchema String `db:"collation_schema"`
15+
CollationName String `db:"collation_name"`
16+
NumericPrecision *int `db:"numeric_precision"`
17+
NumericPrecisionRadix *int `db:"numeric_precision_radix"`
18+
NumericScale *int `db:"numeric_scale"`
19+
DatetimePrecision *int `db:"datetime_precision"`
20+
IntervalType String `db:"interval_type"`
21+
IntervalPrecision *int `db:"interval_precision"`
22+
DomainDefault String `db:"domain_default"`
23+
UDTCatalog String `db:"udt_catalog"`
24+
UDTSchema String `db:"udt_schema"`
25+
UDTName String `db:"udt_name"`
26+
ScopeCatalog String `db:"scope_catalog"`
27+
ScopeSchema String `db:"scope_schema"`
28+
ScopeName String `db:"scope_name"`
29+
MaximumCardinality *int `db:"maximum_cardinality"`
30+
DTDIdentifier String `db:"dtd_identifier"`
31+
}

information/schema.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package information
2+
3+
type Schema struct {
4+
CatalogName String `db:"catalog_name"`
5+
SchemaName String `db:"schema_name"`
6+
SchemaOwner String `db:"schema_owner"`
7+
DefaultCharacterSetCatalog String `db:"default_character_set_catalog"`
8+
DefaultCharacterSetSchema String `db:"default_character_set_schema"`
9+
DefaultCharacterSetName String `db:"default_character_set_name"`
10+
SqlPath String `db:"sql_path"`
11+
}

information/table.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package information
2+
3+
import (
4+
"context"
5+
6+
"github.com/domonda/go-sqldb/db"
7+
)
8+
9+
type Table struct {
10+
TableCatalog String `db:"table_catalog"`
11+
TableSchema String `db:"table_schema"`
12+
TableName String `db:"table_name"`
13+
TableType String `db:"table_type"`
14+
SelfReferencingColumnName String `db:"self_referencing_column_name"`
15+
ReferenceGeneration String `db:"reference_generation"`
16+
UserDefinedTypeCatalog String `db:"user_defined_type_catalog"`
17+
UserDefinedTypeSchema String `db:"user_defined_type_schema"`
18+
UserDefinedTypeName String `db:"user_defined_type_name"`
19+
IsInsertableInto YesNo `db:"is_insertable_into"`
20+
IsTyped YesNo `db:"is_typed"`
21+
CommitAction String `db:"commit_action"`
22+
}
23+
24+
func GetTable(ctx context.Context, catalog, schema, name string) (table *Table, err error) {
25+
err = db.Conn(ctx).QueryRow(
26+
`select *
27+
from information_schema.tables
28+
where table_catalog = $1
29+
and table_schema = $2
30+
and table_name = $3`,
31+
catalog,
32+
schema,
33+
name,
34+
).ScanStruct(&table)
35+
if err != nil {
36+
return nil, err
37+
}
38+
return table, nil
39+
}
40+
41+
func GetAllTables(ctx context.Context) (tables []*Table, err error) {
42+
err = db.Conn(ctx).QueryRows(
43+
`select * from information_schema.tables`,
44+
).ScanStructSlice(&tables)
45+
if err != nil {
46+
return nil, err
47+
}
48+
return tables, nil
49+
}

information/types.go

Lines changed: 0 additions & 161 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package information
22

33
import (
4-
"context"
54
"fmt"
6-
7-
"github.com/domonda/go-sqldb/db"
85
)
96

107
// YesNo is a bool type that implements the sql.Scanner
@@ -60,161 +57,3 @@ func (y *String) Scan(value any) error {
6057
}
6158
return nil
6259
}
63-
64-
type Schema struct {
65-
CatalogName String `db:"catalog_name"`
66-
SchemaName String `db:"schema_name"`
67-
SchemaOwner String `db:"schema_owner"`
68-
DefaultCharacterSetCatalog String `db:"default_character_set_catalog"`
69-
DefaultCharacterSetSchema String `db:"default_character_set_schema"`
70-
DefaultCharacterSetName String `db:"default_character_set_name"`
71-
SqlPath String `db:"sql_path"`
72-
}
73-
74-
type Table struct {
75-
TableCatalog String `db:"table_catalog"`
76-
TableSchema String `db:"table_schema"`
77-
TableName String `db:"table_name"`
78-
TableType String `db:"table_type"`
79-
SelfReferencingColumnName String `db:"self_referencing_column_name"`
80-
ReferenceGeneration String `db:"reference_generation"`
81-
UserDefinedTypeCatalog String `db:"user_defined_type_catalog"`
82-
UserDefinedTypeSchema String `db:"user_defined_type_schema"`
83-
UserDefinedTypeName String `db:"user_defined_type_name"`
84-
IsInsertableInto YesNo `db:"is_insertable_into"`
85-
IsTyped YesNo `db:"is_typed"`
86-
CommitAction String `db:"commit_action"`
87-
}
88-
89-
func GetTable(ctx context.Context, catalog, schema, name string) (table *Table, err error) {
90-
err = db.Conn(ctx).QueryRow(
91-
`select *
92-
from information_schema.tables
93-
where table_catalog = $1
94-
and table_schema = $2
95-
and table_name = $3`,
96-
catalog,
97-
schema,
98-
name,
99-
).ScanStruct(&table)
100-
if err != nil {
101-
return nil, err
102-
}
103-
return table, nil
104-
}
105-
106-
func GetAllTables(ctx context.Context) (tables []*Table, err error) {
107-
err = db.Conn(ctx).QueryRows(
108-
`select * from information_schema.tables`,
109-
).ScanStructSlice(&tables)
110-
if err != nil {
111-
return nil, err
112-
}
113-
return tables, nil
114-
}
115-
116-
type View struct {
117-
CatalogName String `db:"catalog_name"`
118-
SchemaName String `db:"schema_name"`
119-
SchemaOwner String `db:"schema_owner"`
120-
DefaultCharacterSetCatalog String `db:"default_character_set_catalog"`
121-
DefaultCharacterSetSchema String `db:"default_character_set_schema"`
122-
DefaultCharacterSetName String `db:"default_character_set_name"`
123-
SqlPath String `db:"sql_path"`
124-
}
125-
126-
type Column struct {
127-
TableCatalog String `db:"table_catalog"`
128-
TableSchema String `db:"table_schema"`
129-
TableName String `db:"table_name"`
130-
ColumnName String `db:"column_name"`
131-
OrdinalPosition int `db:"ordinal_position"`
132-
ColumnDefault String `db:"column_default"`
133-
IsNullable YesNo `db:"is_nullable"`
134-
DataType String `db:"data_type"`
135-
CharacterMaximumLength *int `db:"character_maximum_length"`
136-
CharacterOctetLength *int `db:"character_octet_length"`
137-
NumericPrecision *int `db:"numeric_precision"`
138-
NumericPrecisionRadix *int `db:"numeric_precision_radix"`
139-
NumericScale *int `db:"numeric_scale"`
140-
DatetimePrecision *int `db:"datetime_precision"`
141-
IntervalType String `db:"interval_type"`
142-
IntervalPrecision *int `db:"interval_precision"`
143-
CharacterSetCatalog String `db:"character_set_catalog"`
144-
CharacterSetSchema String `db:"character_set_schema"`
145-
CharacterSetName String `db:"character_set_name"`
146-
CollationCatalog String `db:"collation_catalog"`
147-
CollationSchema String `db:"collation_schema"`
148-
CollationName String `db:"collation_name"`
149-
DomainCatalog String `db:"domain_catalog"`
150-
DomainSchema String `db:"domain_schema"`
151-
DomainName String `db:"domain_name"`
152-
UDTCatalog String `db:"udt_catalog"`
153-
UDTSchema String `db:"udt_schema"`
154-
UDTName String `db:"udt_name"`
155-
ScopeCatalog String `db:"scope_catalog"`
156-
ScopeSchema String `db:"scope_schema"`
157-
ScopeName String `db:"scope_name"`
158-
MaximumCardinality *int `db:"maximum_cardinality"`
159-
DTDIdentifier String `db:"dtd_identifier"`
160-
IsSelfReferencing YesNo `db:"is_self_referencing"`
161-
IsIdentity YesNo `db:"is_identity"`
162-
IdentityGeneration String `db:"identity_generation"`
163-
IdentityStart String `db:"identity_start"`
164-
IdentityIncrement String `db:"identity_increment"`
165-
IdentityMaximum String `db:"identity_maximum"`
166-
IdentityMinimum String `db:"identity_minimum"`
167-
IdentityCycle YesNo `db:"identity_cycle"`
168-
IsGenerated String `db:"is_generated"`
169-
GenerationExpression String `db:"generation_expression"`
170-
IsUpdatable YesNo `db:"is_updatable"`
171-
}
172-
173-
type KeyColumnUsage struct {
174-
ConstraintCatalog String `db:"constraint_catalog"`
175-
ConstraintSchema String `db:"constraint_schema"`
176-
ConstraintName String `db:"constraint_name"`
177-
TableCatalog String `db:"table_catalog"`
178-
TableSchema String `db:"table_schema"`
179-
TableName String `db:"table_name"`
180-
ColumnName String `db:"column_name"`
181-
OrdinalPosition int `db:"ordinal_position"`
182-
PositionInUniqueConstraint *int `db:"position_in_unique_constraint"`
183-
}
184-
185-
type Domains struct {
186-
DomainCatalog String `db:"domain_catalog"`
187-
DomainSchema String `db:"domain_schema"`
188-
DomainName String `db:"domain_name"`
189-
DataType String `db:"data_type"`
190-
CharacterMaximumLength *int `db:"character_maximum_length"`
191-
CharacterOctetLength *int `db:"character_octet_length"`
192-
CharacterSetCatalog String `db:"character_set_catalog"`
193-
CharacterSetSchema String `db:"character_set_schema"`
194-
CharacterSetName String `db:"character_set_name"`
195-
CollationCatalog String `db:"collation_catalog"`
196-
CollationSchema String `db:"collation_schema"`
197-
CollationName String `db:"collation_name"`
198-
NumericPrecision *int `db:"numeric_precision"`
199-
NumericPrecisionRadix *int `db:"numeric_precision_radix"`
200-
NumericScale *int `db:"numeric_scale"`
201-
DatetimePrecision *int `db:"datetime_precision"`
202-
IntervalType String `db:"interval_type"`
203-
IntervalPrecision *int `db:"interval_precision"`
204-
DomainDefault String `db:"domain_default"`
205-
UDTCatalog String `db:"udt_catalog"`
206-
UDTSchema String `db:"udt_schema"`
207-
UDTName String `db:"udt_name"`
208-
ScopeCatalog String `db:"scope_catalog"`
209-
ScopeSchema String `db:"scope_schema"`
210-
ScopeName String `db:"scope_name"`
211-
MaximumCardinality *int `db:"maximum_cardinality"`
212-
DTDIdentifier String `db:"dtd_identifier"`
213-
}
214-
215-
type CheckConstraints struct {
216-
ConstraintCatalog String `db:"constraint_catalog"`
217-
ConstraintSchema String `db:"constraint_schema"`
218-
ConstraintName String `db:"constraint_name"`
219-
CheckClause String `db:"check_clause"`
220-
}

0 commit comments

Comments
 (0)