sqlc icon indicating copy to clipboard operation
sqlc copied to clipboard

JSONB not working? Or did I set it up incorrectly?

Open didip opened this issue 3 years ago • 1 comments

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

didip avatar Jul 14 '22 23:07 didip

Check what objmap["context"] is returning. It likely isn't valid JSON

luke-single avatar Jul 19 '22 05:07 luke-single