Skip to content

Commit 7986572

Browse files
authored
Add create and update kwargs usage (#30)
1 parent 78ec5fc commit 7986572

14 files changed

+77
-87
lines changed

.github/workflows/changelog.yml

+1-6
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,13 @@ jobs:
1414
- name: Checkout code
1515
uses: actions/checkout@v4
1616
with:
17-
fetch-depth: 0
1817
ref: ${{ github.event.release.target_commitish }}
1918

20-
- name: Extract release date from git tag
21-
run: |
22-
echo "date=$(git log -1 --date=short --format=%ad '${{ github.event.release.tag_name }}')" >> $GITHUB_OUTPUT;
23-
2419
- name: Update Changelog
2520
uses: stefanzweifel/changelog-updater-action@v1
2621
with:
27-
latest-version: ${{ github.event.release.tag_name }}
2822
release-notes: ${{ github.event.release.body }}
23+
latest-version: ${{ github.event.release.tag_name }}
2924
path-to-changelog: docs/changelog.md
3025

3126
- name: Commit updated CHANGELOG

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ pip install sqlalchemy-crud-plus
1212

1313
[SQLAlchemy CRUD Plus](https://fastapi-practices.github.io/sqlalchemy-crud-plus)
1414

15+
## 互动
16+
17+
[TG / Discord](https://wu-clan.github.io/homepage/)
18+
1519
## 赞助
1620

1721
如果此项目能够帮助到你,你可以赞助作者一些咖啡豆表示鼓励:[:coffee: Sponsor :coffee:](https://wu-clan.github.io/sponsor/)

docs/changelog.md

-15
Original file line numberDiff line numberDiff line change
@@ -1,16 +1 @@
11
# Change Logs
2-
3-
## 1.4.0 - 2024-08-27
4-
5-
### What's Changed
6-
7-
* Add lint and test ci by @wu-clan in https://github.com/fastapi-practices/sqlalchemy-crud-plus/pull/24
8-
* Fix the cache for docs ci by @wu-clan in https://github.com/fastapi-practices/sqlalchemy-crud-plus/pull/25
9-
* Update model primary key for dynamic retrieval by @DavidSche in https://github.com/fastapi-practices/sqlalchemy-crud-plus/pull/23
10-
* Prepare for 1.4.0 release by @wu-clan in https://github.com/fastapi-practices/sqlalchemy-crud-plus/pull/26
11-
12-
### New Contributors
13-
14-
* @DavidSche made their first contribution in https://github.com/fastapi-practices/sqlalchemy-crud-plus/pull/23
15-
16-
**Full Changelog**: https://github.com/fastapi-practices/sqlalchemy-crud-plus/compare/1.3.0...1.4.0

docs/usage/create_model.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ async def create_model(
44
session: AsyncSession,
55
obj: CreateSchema,
66
commit: bool = False,
7-
**kwargs
7+
**kwargs,
88
) -> Model:
99
````
1010

11-
!!! note "create_model <独特>的关键字参数"
11+
此方法提供 `commit` 参数,详见:[提交](../advanced/commit.md)
12+
13+
!!! note "关键字参数"
1214

1315
除了必须传入 obj schema 外,还可以通过关键字入参,传入非 schema
1416
参数,比如,对于某些特定场景,其中一个字段并不是通用的,也不需要进行输入控制,只需在写入时赋予指定值,那么你可以使用关键字入参即可

docs/usage/create_models.md

+11-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
```python
22
async def create_models(
3-
self,
4-
session: AsyncSession,
5-
obj: Iterable[CreateSchema],
6-
commit: bool = False
3+
self,
4+
session: AsyncSession,
5+
objs: Iterable[CreateSchema],
6+
commit: bool = False,
7+
**kwargs,
78
) -> list[Model]:
89
```
910

10-
此方法提供 `commit` 参数,详见:[提交](../advanced/commit.md)
11+
- 此方法提供 `commit` 参数,详见:[提交](../advanced/commit.md)
12+
13+
- 此方法还提供与 `create_model()` 相同用法的关键字参数,需要额外注意的是,`create_models()` 会将关键字参数写入每个实例中
1114

1215
## 示例
1316

@@ -33,8 +36,8 @@ class CreateIns(BaseModel):
3336

3437

3538
class CRUDIns(CRUDPlus[ModelIns]):
36-
async def creates(self, db: AsyncSession, obj: Iterable[CreateIns]) -> list[ModelIns]: # (1)
37-
return await self.create_models(db, obj)
39+
async def creates(self, db: AsyncSession, objs: Iterable[CreateIns]) -> list[ModelIns]: # (1)
40+
return await self.create_models(db, objs)
3841
```
3942

40-
1. obj 必须是一个 schema 列表
43+
1. objs 必须是一个 schema 列表

docs/usage/delete_model.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
```py
22
async def delete_model(
33
self,
4-
session: AsyncSession,
5-
pk: int,
6-
commit: bool = False
4+
session: AsyncSession,
5+
pk: int,
6+
commit: bool = False,
77
) -> int:
88
```
99

docs/usage/select.md

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
```py
2-
async def select(
3-
self,
4-
**kwargs
5-
) -> Select:
2+
async def select(self, **kwargs) -> Select:
3+
...
64
```
75

86
此方法用于构造 SQLAlchemy

docs/usage/select_model.md

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
```py
2-
async def select_model(
3-
self,
4-
session: AsyncSession,
5-
pk: int
6-
) -> Model | None:
2+
async def select_model(self, session: AsyncSession, pk: int) -> Model | None:
73
```
84

95
此方法使用主键 pk 参数,详见:[主键](../advanced/primary_key.md)

docs/usage/select_model_by_column.md

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
```py
2-
async def select_model_by_column(
3-
self,
4-
session: AsyncSession,
5-
**kwargs
6-
) -> Model | None:
2+
async def select_model_by_column(self, session: AsyncSession, **kwargs) -> Model | None:
73
```
84

95
此方法可结合 [高级过滤器](../advanced/filter.md) 使用

docs/usage/select_models.md

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
```py
2-
async def select_models(
3-
self,
4-
session: AsyncSession,
5-
**kwargs
6-
) -> Sequence[Row[Any] | RowMapping | Any]:
2+
async def select_models(self, session: AsyncSession, **kwargs) -> Sequence[Row[Any] | RowMapping | Any]:
73
```
84

95
此方法可结合 [高级过滤器](../advanced/filter.md) 使用

docs/usage/select_models_order.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
```py
2-
async def select_models_order(
3-
self,
4-
session: AsyncSession,
5-
sort_columns: str | list[str],
6-
sort_orders: str | list[str] | None = None,
7-
**kwargs
2+
async def select_models_order(
3+
self,
4+
session: AsyncSession,
5+
sort_columns: str | list[str],
6+
sort_orders: str | list[str] | None = None,
7+
**kwargs,
88
) -> Sequence[Row | RowMapping | Any] | None:
99
```
1010

docs/usage/update_model.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
```py
22
async def update_model(
3-
self,
3+
self,
44
session: AsyncSession,
55
pk: int,
66
obj: UpdateSchema | dict[str, Any],
7-
commit: bool = False
7+
commit: bool = False,
8+
**kwargs,
89
) -> int:
910
```
1011

1112
- 此方法使用主键 pk 参数,详见:[主键](../advanced/primary_key.md)
1213

1314
- 此方法提供 `commit` 参数,详见:[提交](../advanced/commit.md)
1415

16+
- 此方法还提供与 `create_model()` 相同用法的关键字参数
17+
1518
## 示例
1619

1720
```py title="update_model" hl_lines="23"

mkdocs.yml

+25-22
Original file line numberDiff line numberDiff line change
@@ -9,58 +9,61 @@ nav:
99
- Home: index.md
1010
- Installing: installing.md
1111
- Usage:
12-
- 新增: usage/create_model.md
13-
- 新增 - 多条: usage/create_models.md
14-
- 查询 - 主键 ID: usage/select_model.md
15-
- 查询 - 条件过滤: usage/select_model_by_column.md
16-
- Select: usage/select.md
17-
- Select - 排序: usage/select_order.md
18-
- 查询 - 列表: usage/select_models.md
19-
- 查询 - 列表排序: usage/select_models_order.md
20-
- 更新 - 主键 ID: usage/update_model.md
21-
- 更新 - 条件过滤: usage/update_model_by_column.md
22-
- 删除 - 主键 ID: usage/delete_model.md
23-
- 删除 - 条件过滤: usage/delete_model_by_column.md
12+
- 新增:
13+
- 单条: usage/create_model.md
14+
- 多条: usage/create_models.md
15+
- 查询:
16+
- 主键 ID: usage/select_model.md
17+
- 条件过滤: usage/select_model_by_column.md
18+
- Select: usage/select.md
19+
- Select 排序: usage/select_order.md
20+
- 列表: usage/select_models.md
21+
- 列表排序: usage/select_models_order.md
22+
- 更新:
23+
- 主键 ID: usage/update_model.md
24+
- 高级用法: usage/update_model_by_column.md
25+
- 删除:
26+
- 主键 ID: usage/delete_model.md
27+
- 高级用法: usage/delete_model_by_column.md
2428
- Advanced:
2529
- 主键: advanced/primary_key.md
2630
- 提交: advanced/commit.md
27-
- 条件过滤: advanced/filter.md
31+
- 条件过滤: advanced/filter.md
2832
- Changelog: changelog.md
2933
theme:
3034
name: material
3135
font:
3236
code: Roboto Mono
3337
palette:
34-
- media: "(prefers-color-scheme)"
35-
primary: green
38+
- media: '(prefers-color-scheme)'
3639
toggle:
3740
icon: material/brightness-auto
3841
name: Switch to light mode
39-
- media: "(prefers-color-scheme: light)"
42+
- media: '(prefers-color-scheme: light)'
4043
scheme: default
4144
primary: pink
4245
toggle:
4346
icon: material/brightness-7
4447
name: Switch to dark mode
45-
- media: "(prefers-color-scheme: dark)"
48+
- media: '(prefers-color-scheme: dark)'
4649
scheme: slate
47-
primary: green
50+
primary: teal
4851
toggle:
4952
icon: material/brightness-4
50-
name: Switch to auto mode
53+
name: Switch to system preference
5154
features:
5255
- content.code.annotate
5356
- content.code.select
5457
- navigation.instant
5558
- navigation.instant.progress
59+
- navigation.path
5660
- navigation.tracking
5761
- navigation.tabs
5862
- navigation.tabs.sticky
59-
- search.suggest
60-
- toc.follow
61-
- toc.integrate
6263
- navigation.top
6364
- navigation.footer
65+
- search.suggest
66+
- toc.follow
6467
plugins:
6568
- search
6669
markdown_extensions:

sqlalchemy_crud_plus/crud.py

+13-4
Original file line numberDiff line numberDiff line change
@@ -54,20 +54,26 @@ async def create_model(
5454
async def create_models(
5555
self,
5656
session: AsyncSession,
57-
obj: Iterable[CreateSchema],
57+
objs: Iterable[CreateSchema],
5858
commit: bool = False,
59+
**kwargs,
5960
) -> list[Model]:
6061
"""
6162
Create new instances of a model
6263
6364
:param session: The SQLAlchemy async session.
64-
:param obj: The Pydantic schema list containing data to be saved.
65+
:param objs: The Pydantic schema list containing data to be saved.
6566
:param commit: If `True`, commits the transaction immediately. Default is `False`.
67+
:param kwargs: Additional model data not included in the pydantic schema.
6668
:return:
6769
"""
6870
ins_list = []
69-
for ins in obj:
70-
ins_list.append(self.model(**ins.model_dump()))
71+
for obj in objs:
72+
if not kwargs:
73+
ins = self.model(**obj.model_dump())
74+
else:
75+
ins = self.model(**obj.model_dump(), **kwargs)
76+
ins_list.append(ins)
7177
session.add_all(ins_list)
7278
if commit:
7379
await session.commit()
@@ -164,6 +170,7 @@ async def update_model(
164170
pk: int,
165171
obj: UpdateSchema | dict[str, Any],
166172
commit: bool = False,
173+
**kwargs,
167174
) -> int:
168175
"""
169176
Update an instance by model's primary key
@@ -178,6 +185,8 @@ async def update_model(
178185
instance_data = obj
179186
else:
180187
instance_data = obj.model_dump(exclude_unset=True)
188+
if kwargs:
189+
instance_data.update(kwargs)
181190
stmt = update(self.model).where(self.primary_key == pk).values(**instance_data)
182191
result = await session.execute(stmt)
183192
if commit:

0 commit comments

Comments
 (0)