Skip to content

SQLModel session.get() fails with NoSuchColumnError #74

@bystepii

Description

@bystepii

Environment

  • Python version: 3.11.14
  • SQLAlchemy version: 2.0.44
  • SQLModel version: 0.0.27
  • pydynamodb version: 0.7.5

Description

Calling session.get(Table, "<pk>") results in a NoSuchColumnError when loading item by primary key.

Minimal Reproducible Example

import uuid
from pydynamodb import sqlalchemy_dynamodb
from sqlalchemy.engine import create_engine
from sqlmodel import Session, Field, SQLModel
import boto3


class Team(SQLModel, table=True):
    id: str = Field(default_factory=lambda: uuid.uuid4().hex, primary_key=True)
    name: str = Field(index=True)
    headquarters: str


session = boto3.Session()
client = session.client("dynamodb")
credentials = session.get_credentials()
aws_access_key_id = credentials.access_key
aws_secret_access_key = credentials.secret_key
region_name = session.region_name

conn_str = (
    "dynamodb://{aws_access_key_id}:{aws_secret_access_key}@dynamodb.{region_name}.amazonaws.com:443"
).format(
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key,
    region_name=region_name,
)
engine = create_engine(conn_str, echo=True)

with Session(engine) as session:
    results = session.get(Team, "some-id")
    print(results)

Observed Behavior

session.get() triggers a fatal NoSuchColumnError:

2025-11-17 18:59:27,674 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2025-11-17 18:59:27,675 INFO sqlalchemy.engine.Engine SELECT id, name, headquarters 
FROM team 
WHERE id = ?
2025-11-17 18:59:27,675 INFO sqlalchemy.engine.Engine [generated in 0.00011s] ('some-id',)
2025-11-17 18:59:28,050 INFO sqlalchemy.engine.Engine ROLLBACK
Traceback (most recent call last):
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py", line 859, in _indexes_for_keys
    return [self._keymap[key][0] for key in keys]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py", line 859, in <listcomp>
    return [self._keymap[key][0] for key in keys]
            ~~~~~~~~~~~~^^^^^
KeyError: Column('id', AutoString(), table=<team>, primary_key=True, nullable=False, default=CallableColumnDefault(<function Team.<lambda> at 0x77df6c97a160>))

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/tmp/test/main.py", line 33, in <module>
    results = session.get(Team, "some-id")
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 3680, in get
    return self._get_impl(
           ^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 3859, in _get_impl
    return db_load_fn(
           ^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/loading.py", line 695, in load_on_pk_identity
    session.execute(
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlmodel/orm/session.py", line 144, in execute
    return super().execute(
           ^^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 2351, in execute
    return self._execute_internal(
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 2249, in _execute_internal
    result: Result[Any] = compile_state_cls.orm_execute_statement(
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/context.py", line 309, in orm_execute_statement
    return cls.orm_setup_cursor_result(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/context.py", line 616, in orm_setup_cursor_result
    return loading.instances(result, querycontext)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/loading.py", line 133, in instances
    with util.safe_reraise():
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py", line 224, in __exit__
    raise exc_value.with_traceback(exc_tb)
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/loading.py", line 114, in instances
    *[
     ^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/loading.py", line 115, in <listcomp>
    query_entity.row_processor(context, cursor)
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/context.py", line 2786, in row_processor
    _instance = loading._instance_processor(
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/orm/loading.py", line 878, in _instance_processor
    primary_key_getter = result._tuple_getter(pk_cols)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/engine/result.py", line 1189, in _tuple_getter
    return self._metadata._row_as_tuple_getter(keys)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/engine/result.py", line 179, in _row_as_tuple_getter
    indexes = self._indexes_for_keys(keys)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py", line 862, in _indexes_for_keys
    CursorResultMetaData._key_fallback(self, ke.args[0], ke)
  File "/home/user/miniconda3/envs/test/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py", line 825, in _key_fallback
    raise exc.NoSuchColumnError(
sqlalchemy.exc.NoSuchColumnError: Could not locate column in row for column 'team.id'

Expected Behavior

session.get() should return an instance of model or None.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions