Skip to content

Commit f6222d1

Browse files
authored
Fix the return of the query with join (#75)
1 parent d13fe7c commit f6222d1

File tree

3 files changed

+12
-8
lines changed

3 files changed

+12
-8
lines changed

sqlalchemy_crud_plus/crud.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ async def select_model(
240240
load_strategies: LoadStrategies | None = None,
241241
join_conditions: JoinConditions | None = None,
242242
**kwargs: Any,
243-
) -> Model | None:
243+
) -> Sequence[Row[tuple[Model, ...]] | None] | Model | None:
244244
"""
245245
Query by primary key(s) with optional relationship loading and joins.
246246
@@ -276,8 +276,7 @@ async def select_model(
276276

277277
if join_conditions:
278278
if has_join_fill_result(join_conditions):
279-
result = query.first()
280-
return result[0] if result else None
279+
return query.first()
281280

282281
return query.scalars().first()
283282

@@ -289,7 +288,7 @@ async def select_model_by_column(
289288
load_strategies: LoadStrategies | None = None,
290289
join_conditions: JoinConditions | None = None,
291290
**kwargs: Any,
292-
) -> Model | None:
291+
) -> Sequence[Row[tuple[Model, ...]] | None] | Model | None:
293292
"""
294293
Query by column with optional relationship loading and joins.
295294
@@ -313,8 +312,7 @@ async def select_model_by_column(
313312

314313
if join_conditions:
315314
if has_join_fill_result(join_conditions):
316-
result = query.first()
317-
return result[0] if result else None
315+
return query.first()
318316

319317
return query.scalars().first()
320318

sqlalchemy_crud_plus/types.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import Any, Literal, TypeVar
66

77
from pydantic import BaseModel, ConfigDict, Field
8+
from sqlalchemy import Alias, Table
89
from sqlalchemy.orm import DeclarativeBase
910
from sqlalchemy.orm.util import AliasedClass
1011
from sqlalchemy.sql.base import ExecutableOption
@@ -56,7 +57,9 @@
5657
class JoinConfig(BaseModel):
5758
model_config = ConfigDict(arbitrary_types_allowed=True)
5859

59-
model: type[Model] | AliasedClass = Field(description='The target model or aliased class to join with')
60+
model: type[Model] | AliasedClass | Alias | Table = Field(
61+
description='The target model, aliased class, alias, or table to join with'
62+
)
6063
join_on: Any = Field(description='The join condition expression (e.g., model.id == other_model.id)')
6164
join_type: JoinType = Field(default='left', description='The type of join to perform')
6265
fill_result: bool = Field(default=False, description='Whether to populate this model to the query result')

tests/test_no_relationship.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,10 @@ async def test_join_fill_result_single_model(
530530
)
531531

532532
if result is not None:
533-
assert isinstance(result, NoRelUser)
533+
assert isinstance(result, (tuple, Row))
534+
assert isinstance(result[0], NoRelUser)
535+
if result[1]:
536+
assert isinstance(result[1], NoRelProfile)
534537

535538

536539
@pytest.mark.asyncio

0 commit comments

Comments
 (0)