sqlc
sqlc copied to clipboard
JSONB not working? Or did I set it up incorrectly?
Version
1.13.0
What happened?
This is my schema (simplified for brevity):
CREATE TABLE IF NOT EXISTS cleric_druid_queries (
id text PRIMARY KEY,
context jsonb,
updated_time timestamp without time zone default (now() at time zone 'utc')
);
This is the generated struct (simplified for brevity):
type UpsertClericDruidQueryParams struct {
ID string `db:"id" json:"id"`
Context pqtype.NullRawMessage `db:"context" json:"context"`
}
Looks fine to me.
But when I tried to run my method:
// objmap["context"] has the correct json.RawMessage type
dbParams := cleric_druid_queries.UpsertClericDruidQueryParams{
ID: queryData.Context.QueryID,
Context: pqtype.NullRawMessage{RawMessage: objmap["context"], Valid: true},
}
_, err = s.ClericDruidQueryModel.UpsertClericDruidQuery(context.Background(), dbParams)
The error said pq: invalid input syntax for type json. What am I missing?
I don't actually care about types because I just want to UPSERT as fast as I can, interface{} type is fine too.
What can I do to unblock myself?
Relevant log output
No response
Database schema
CREATE TABLE IF NOT EXISTS cleric_druid_queries (
id text PRIMARY KEY,
datasource text,
dimensions text[],
sql_query_id text,
sql_query text,
query text,
time_taken int,
query_identity text,
success BOOLEAN,
historical_error text,
superset_username text,
superset_dashboard_id int,
superset_widget_id int,
context jsonb,
updated_time timestamp without time zone default (now() at time zone 'utc')
);
SQL queries
-- name: UpsertClericDruidQuery :one
INSERT INTO cleric_druid_queries as t(
id, datasource, dimensions, query, time_taken, query_identity, success, sql_query_id, sql_query, historical_error, superset_username, superset_dashboard_id, superset_widget_id, context
) VALUES (
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14
)
ON CONFLICT (id)
DO UPDATE SET
id = EXCLUDED.id,
datasource = COALESCE(NULLIF(EXCLUDED.datasource, ''), NULLIF(t.datasource, ''), ''),
dimensions = COALESCE(NULLIF(EXCLUDED.dimensions, '{}'), NULLIF(t.dimensions, '{}'), '{}'),
query = COALESCE(NULLIF(EXCLUDED.query, ''), NULLIF(t.query, ''), ''),
time_taken = COALESCE(NULLIF(EXCLUDED.time_taken, 0), NULLIF(t.time_taken, 0), 0),
query_identity = COALESCE(NULLIF(EXCLUDED.query_identity, ''), NULLIF(t.query_identity, ''), ''),
success = COALESCE(NULLIF(EXCLUDED.success, FALSE), NULLIF(t.success, FALSE), FALSE),
sql_query_id = COALESCE(NULLIF(EXCLUDED.sql_query_id, ''), NULLIF(t.sql_query_id, ''), ''),
sql_query = COALESCE(NULLIF(EXCLUDED.sql_query, ''), NULLIF(t.sql_query, ''), ''),
historical_error = COALESCE(NULLIF(EXCLUDED.historical_error, ''), NULLIF(t.historical_error, ''), ''),
superset_username = COALESCE(NULLIF(EXCLUDED.superset_username, ''), NULLIF(t.superset_username, ''), ''),
superset_dashboard_id = COALESCE(NULLIF(EXCLUDED.superset_dashboard_id, 0), NULLIF(t.superset_dashboard_id, 0), 0),
superset_widget_id = COALESCE(NULLIF(EXCLUDED.superset_widget_id, 0), NULLIF(t.superset_widget_id, 0), 0),
context = COALESCE(NULLIF(EXCLUDED.context, ''), NULLIF(t.context, ''), '')
RETURNING *;
Configuration
version: 2
sql:
- schema: _sqlc/cleric_druid_queries_schema.sql
queries: _sqlc/cleric_druid_queries_queries.sql
engine: postgresql
gen:
go:
package: cleric_druid_queries
out: cleric_druid_queries
emit_db_tags: true
emit_json_tags: true
Playground URL
No response
What operating system are you using?
Linux, macOS
What database engines are you using?
PostgreSQL
What type of code are you generating?
Go
Check what objmap["context"] is returning. It likely isn't valid JSON