Skip to content

Generate Data Model does not emit primary_key: true for PostgreSQL tables with named PKs #10517

@Funbucket

Description

@Funbucket

Bug Description

When using Generate Data Model in Cube Playground (v1.6.23, PostgreSQL), primary key columns are not marked with primary_key: true in the generated YAML. This causes compile errors for any cube that has joins defined:

salesorderheader cube: primary key for 'salesorderheader' is required when join is defined
salesorderdetail cube: primary key for 'salesorderdetail' is required when join is defined
... (dozens more)

Root Cause

DevServer.ts calls driver.tablesSchema() in both the /playground/db-schema and /playground/generate-schema endpoints:

// Line 141
const tablesSchema = await driver.tablesSchema();

// Line 179
const tablesSchema = req.body.tablesSchema || (await driver.tablesSchema());

tablesSchema() only queries information_schema.columns and does not fetch primary key constraints. As a result, no column ever gets attributes: ['primaryKey'], so ScaffoldingSchema.dimensions() never sets isPrimaryKey: true, and BaseSchemaFormatter never emits primary_key: true.

The correct method is tablesSchemaV2(), which calls primaryKeys() (overridden in PostgresDriver with a real information_schema.table_constraints query) and merges the results into the column data with attributes: ['primaryKey'].

Steps to Reproduce

  1. Connect Cube Playground to a PostgreSQL database (e.g. AdventureWorks)
  2. Go to Data Model → Generate Data Model
  3. Select any table with a join (e.g. sales.salesorderheader)
  4. Click Generate
  5. Observe the generated YAML has no primary_key: true dimension
  6. Cube fails to compile with: primary key for 'X' is required when join is defined

Affected Tables / Columns

The bug affects all tables where the PK column name is not literally id. The scaffolding has a fallback heuristic fixCase(column.name) === 'id' but real-world tables use names like salesorderid, productid, businessentityid, etc.

Expected Behavior

Generated YAML should include the PK dimension marked as primary_key: true:

dimensions:
  - name: salesorderid
    sql: salesorderid
    type: number
    primary_key: true
    public: false

Fix

In packages/cubejs-server-core/src/core/DevServer.ts, replace both calls to tablesSchema() with tablesSchemaV2():

- const tablesSchema = await driver.tablesSchema();
+ const tablesSchema = await driver.tablesSchemaV2();
- const tablesSchema = req.body.tablesSchema || (await driver.tablesSchema());
+ const tablesSchema = req.body.tablesSchema || (await driver.tablesSchemaV2());

Environment

  • Cube version: 1.6.23
  • Database: PostgreSQL 14.10
  • Database: AdventureWorks (timchapman/postgresql-adventureworks)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions