Skip to content

get_columns() does not reflect Identity columns #297

@suparngp

Description

@suparngp

CockroachDB supports GENERATED ALWAYS AS IDENTITY columns, and information_schema.columns correctly reports is_identity = 'YES' and identity_generation = 'ALWAYS' for these columns.

However, the dialect's get_columns() does not include identity information in the returned column dict. It returns default: nextval('..._seq') but identity is absent from the result.

This causes Alembic autogenerate to emit a spurious AlterColumnOp on every run for any Identity column — it sees Identity(always=True) in the model but no Identity in the reflected column, and tries to add it.

Reproduction

from sqlalchemy import create_engine, inspect, text

engine = create_engine("cockroachdb://...")

# Create a table with an Identity column
with engine.begin() as conn:
    conn.execute(text("CREATE TABLE IF NOT EXISTS identity_test (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY)"))

# Reflect it
inspector = inspect(engine)
cols = inspector.get_columns("identity_test")
for col in cols:
    print(col)
    # Expected: {..., 'identity': {'always': True, ...}, ...}
    # Actual:   {'name': 'id', 'type': INTEGER(), 'nullable': False, 'default': "nextval('public.identity_test_id_seq'::REGCLASS)", 'autoincrement': True, ...}
    # 'identity' key is absent

# Cleanup
with engine.begin() as conn:
    conn.execute(text("DROP TABLE IF EXISTS identity_test"))

Expected: The identity key should be populated when the column uses GENERATED ALWAYS AS IDENTITY.

Actual: The identity key is absent. The underlying sequence is reported as a plain default.

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