Skip to content

Commit cff3f46

Browse files
committed
refactor: Optimized the session object acquisition logic.
1 parent 04b2f32 commit cff3f46

13 files changed

Lines changed: 663 additions & 1235 deletions

.flake8

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
[flake8]
22
max-line-length = 130
3-
exclude = venv,.git,__pycache__,__init__.py,
3+
exclude = venv,.git,__pycache__,__init__.py,
4+
ignore = B008

README.md

Lines changed: 23 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ from sqlmodel import SQLModel, Field
6666

6767
class User(SQLModel, table=True):
6868
id: int = Field(default=None, primary_key=True, nullable=False)
69-
username: str = Field(title='username', sa_column=Column(String(100), unique=True, index=True, nullable=False))
69+
username: str = Field(title='username', max_length=30, unique=True, index=True, nullable=False)
7070
password: str = Field(default='', title='Password')
71-
create_time: datetime = Field(default_factory=datetime.utcnow, title='Create Time')
71+
create_time: datetime = Field(default_factory=datetime.now, title='Create Time')
7272
```
7373

7474
## AsyncDatabase
@@ -85,55 +85,6 @@ db = AsyncDatabase.create('sqlite+aiosqlite:///amisadmin.db?check_same_thread=Fa
8585

8686
```
8787

88-
### Shortcut functions
89-
90-
```python
91-
from sqlalchemy import insert, select, update, delete
92-
93-
94-
async def fast_execute():
95-
# update
96-
stmt = update(User).where(User.id == 1).values({'username': 'new_user'})
97-
result = await db.execute(stmt)
98-
99-
# select
100-
stmt = select(User).where(User.id == 1)
101-
user = await db.execute(stmt, on_close_pre=lambda r: r.scalar())
102-
103-
# insert
104-
stmt = insert(User).values({'username': 'User-6', 'password': 'password-6'})
105-
result = await db.execute(stmt)
106-
107-
# delete
108-
stmt = delete(User).where(User.id == 6)
109-
result = await db.execute(stmt)
110-
111-
# scalar
112-
user = await db.scalar(select(User).where(User.id == 1))
113-
114-
# scalars_all
115-
stmt = select(User)
116-
result = await db.scalars_all(stmt)
117-
118-
# get
119-
user = await db.get(User, 1)
120-
121-
# delete
122-
user = User(id=1, name='test')
123-
await db.delete(user)
124-
125-
# save(insert or update)
126-
user = User(name='new_user')
127-
await db.save(user)
128-
129-
# run_sync
130-
await db.run_sync(Base.metadata.create_all, is_session=False)
131-
132-
# session_maker
133-
async with db.session_maker() as session:
134-
user = await session.get(User, 1)
135-
```
136-
13788
## Database
13889

13990
### Creation Connection
@@ -149,55 +100,6 @@ db = Database.create('sqlite:///amisadmin.db?check_same_thread=False') # sqlite
149100
# db = Database.create('mssql+pyodbc://scott:tiger@mydsn') # SQL Server
150101
```
151102

152-
### Shortcut functions
153-
154-
```python
155-
from sqlalchemy import insert, select, update, delete
156-
157-
158-
def fast_execute():
159-
# update
160-
stmt = update(User).where(User.id == 1).values({'username': 'new_user'})
161-
result = db.execute(stmt)
162-
163-
# select
164-
stmt = select(User).where(User.id == 1)
165-
user = db.execute(stmt, on_close_pre=lambda r: r.scalar())
166-
167-
# insert
168-
stmt = insert(User).values({'username': 'User-6', 'password': 'password-6'})
169-
result = db.execute(stmt)
170-
171-
# delete
172-
stmt = delete(User).where(User.id == 6)
173-
result = db.execute(stmt)
174-
175-
# scalar
176-
user = db.scalar(select(User).where(User.id == 1))
177-
178-
# scalars_all
179-
stmt = select(User)
180-
result = db.scalars_all(stmt)
181-
182-
# get
183-
user = db.get(User, 1)
184-
185-
# delete
186-
user = User(id=1, name='test')
187-
db.delete(user)
188-
189-
# save(insert or update)
190-
user = User(name='new_user')
191-
db.save(user)
192-
193-
# run_sync
194-
db.run_sync(Base.metadata.create_all, is_session=False)
195-
196-
# session_maker
197-
with db.session_maker() as session:
198-
user = session.get(User, 1)
199-
```
200-
201103
## AbcAsyncDatabase
202104

203105
When you are developing a library of tools, your Python program may require a database connection.
@@ -209,7 +111,7 @@ You can use asynchronous shortcut functions with the `async_` prefix.
209111
`AsyncDatabase` and `Database` both inherit from `AbcAsyncDatabase` and both implement the usual `async_` prefixed asynchronous
210112
shortcut functions.
211113

212-
For example: `async_execute`,`async_scalar`,`async_scalars_all`,`async_get`,`async_delete`,`async_run_sync`.
114+
For example: `async_execute`,`async_scalar`,`async_scalars`,`async_get`,`async_delete`,`async_run_sync`.
213115

214116
Remark: The `async_` prefix in `Database` is implemented by executing the corresponding synchronous shortcut in the thread pool.
215117

@@ -240,9 +142,9 @@ async def fast_execute(db: Union[AsyncDatabase, Database]):
240142
# scalar
241143
user = await db.async_scalar(select(User).where(User.id == 1))
242144

243-
# scalars_all
145+
# scalars
244146
stmt = select(User)
245-
result = await db.async_scalars_all(stmt)
147+
result = await db.async_scalars(stmt)
246148

247149
# get
248150
user = await db.async_get(User, 1)
@@ -251,10 +153,6 @@ async def fast_execute(db: Union[AsyncDatabase, Database]):
251153
user = User(id=1, name='test')
252154
await db.async_delete(user)
253155

254-
# save(insert or update)
255-
user = User(name='new_user')
256-
await db.async_save(user)
257-
258156
# run_sync
259157
await db.async_run_sync(Base.metadata.create_all, is_session=False)
260158

@@ -306,6 +204,24 @@ async def get_user(id: int):
306204

307205
```
308206

207+
## Get session object
208+
209+
You can get the session object anywhere, but you need to manage the lifecycle of the session yourself. For example:
210+
211+
- 1.In FastAPI, you can use middleware or dependencies to get the session object. In the routing function, the method called will
212+
automatically get the session object in the context.
213+
214+
- 2.In the local work unit, you can use the `with` statement to get the session object. In the `with` statement, the method called
215+
will automatically get a new session object.
216+
217+
```mermaid
218+
graph LR
219+
session[Get session] --> scopefunc{Read context var}
220+
scopefunc -->|None| gSession[Return the global default session]
221+
scopefunc -->|Not a Session object| sSession[Return the scoped session corresponding to the current context variable]
222+
scopefunc -->|Is a Session object| cSession[Return session in the current context variable]
223+
```
224+
309225
## More tutorial documentation
310226

311227
### [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy)

README.zh.md

Lines changed: 22 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ from sqlmodel import SQLModel, Field
6666

6767
class User(SQLModel, table=True):
6868
id: int = Field(default=None, primary_key=True, nullable=False)
69-
username: str = Field(title='username', sa_column=Column(String(100), unique=True, index=True, nullable=False))
69+
username: str = Field(title='username', max_length=30, unique=True, index=True, nullable=False)
7070
password: str = Field(default='', title='Password')
71-
create_time: datetime = Field(default_factory=datetime.utcnow, title='Create Time')
71+
create_time: datetime = Field(default_factory=datetime.now, title='Create Time')
7272
```
7373

7474
## AsyncDatabase
@@ -85,55 +85,6 @@ db = AsyncDatabase.create('sqlite+aiosqlite:///amisadmin.db?check_same_thread=Fa
8585

8686
```
8787

88-
### 快捷函数
89-
90-
```python
91-
from sqlalchemy import insert, select, update, delete
92-
93-
94-
async def fast_execute():
95-
# update
96-
stmt = update(User).where(User.id == 1).values({'username': 'new_user'})
97-
result = await db.execute(stmt)
98-
99-
# select
100-
stmt = select(User).where(User.id == 1)
101-
user = await db.execute(stmt, on_close_pre=lambda r: r.scalar())
102-
103-
# insert
104-
stmt = insert(User).values({'username': 'User-6', 'password': 'password-6'})
105-
result = await db.execute(stmt)
106-
107-
# delete
108-
stmt = delete(User).where(User.id == 6)
109-
result = await db.execute(stmt)
110-
111-
# scalar
112-
user = await db.scalar(select(User).where(User.id == 1))
113-
114-
# scalars_all
115-
stmt = select(User)
116-
result = await db.scalars_all(stmt)
117-
118-
# get
119-
user = await db.get(User, 1)
120-
121-
# delete
122-
user = User(id=1, name='test')
123-
await db.delete(user)
124-
125-
# save(insert or update)
126-
user = User(name='new_user')
127-
await db.save(user)
128-
129-
# run_sync
130-
await db.run_sync(Base.metadata.create_all, is_session=False)
131-
132-
# session_maker
133-
async with db.session_maker() as session:
134-
user = await session.get(User, 1)
135-
```
136-
13788
## Database
13889

13990
### 创建连接
@@ -149,54 +100,7 @@ db = Database.create('sqlite:///amisadmin.db?check_same_thread=False') # sqlite
149100
# db = Database.create('mssql+pyodbc://scott:tiger@mydsn') # SQL Server
150101
```
151102

152-
### 快捷函数
153-
154-
```python
155-
from sqlalchemy import insert, select, update, delete
156-
157-
158-
def fast_execute():
159-
# update
160-
stmt = update(User).where(User.id == 1).values({'username': 'new_user'})
161-
result = db.execute(stmt)
162-
163-
# select
164-
stmt = select(User).where(User.id == 1)
165-
user = db.execute(stmt, on_close_pre=lambda r: r.scalar())
166-
167-
# insert
168-
stmt = insert(User).values({'username': 'User-6', 'password': 'password-6'})
169-
result = db.execute(stmt)
170-
171-
# delete
172-
stmt = delete(User).where(User.id == 6)
173-
result = db.execute(stmt)
174-
175-
# scalar
176-
user = db.scalar(select(User).where(User.id == 1))
177-
178-
# scalars_all
179-
stmt = select(User)
180-
result = db.scalars_all(stmt)
181-
182-
# get
183-
user = db.get(User, 1)
184-
185-
# delete
186-
user = User(id=1, name='test')
187-
db.delete(user)
188-
189-
# save(insert or update)
190-
user = User(name='new_user')
191-
db.save(user)
192-
193-
# run_sync
194-
db.run_sync(Base.metadata.create_all, is_session=False)
195-
196-
# session_maker
197-
with db.session_maker() as session:
198-
user = session.get(User, 1)
199-
```
103+
###
200104

201105
## AbcAsyncDatabase
202106

@@ -206,7 +110,7 @@ def fast_execute():
206110

207111
`AsyncDatabase``Database`都继承自`AbcAsyncDatabase`,并且都实现了常用的以`async_`为前缀的异步快捷函数.
208112

209-
例如: `async_execute`,`async_scalar`,`async_scalars_all`,`async_get`,`async_delete`,`async_run_sync`.
113+
例如: `async_execute`,`async_scalar`,`async_scalars`,`async_get`,`async_delete`,`async_run_sync`.
210114

211115
说明: `Database``async_`前缀异步快捷函数,是通过在线程池中执行对应的同步快捷函数实现的.
212116

@@ -237,9 +141,9 @@ async def fast_execute(db: Union[AsyncDatabase, Database]):
237141
# scalar
238142
user = await db.async_scalar(select(User).where(User.id == 1))
239143

240-
# scalars_all
144+
# scalars
241145
stmt = select(User)
242-
result = await db.async_scalars_all(stmt)
146+
result = await db.async_scalars(stmt)
243147

244148
# get
245149
user = await db.async_get(User, 1)
@@ -248,10 +152,6 @@ async def fast_execute(db: Union[AsyncDatabase, Database]):
248152
user = User(id=1, name='test')
249153
await db.async_delete(user)
250154

251-
# save(insert or update)
252-
user = User(name='new_user')
253-
await db.async_save(user)
254-
255155
# run_sync
256156
await db.async_run_sync(Base.metadata.create_all, is_session=False)
257157

@@ -303,6 +203,22 @@ async def get_user(id: int):
303203

304204
```
305205

206+
## 获取session对象
207+
208+
你可以在任何地方获取session对象,但是你需要自己管理session的生命周期.例如:
209+
210+
- 1.在FastAPI中,你可以使用中间件,或者依赖来获取session对象.在路由函数中,调用的方法将自动获取上下文中的session对象.
211+
212+
- 2.在局部工作单元中,你可以使用`with`语句来获取session对象.在`with`语句中,调用的方法将自动获取一个新的session对象.
213+
214+
```mermaid
215+
graph LR
216+
session[Get session] --> scopefunc{Read context var}
217+
scopefunc -->|None| gSession[Return the global default session]
218+
scopefunc -->|Not a Session object| sSession[Return the scoped session corresponding to the current context variable]
219+
scopefunc -->|Is a Session object| cSession[Return session in the current context variable]
220+
```
221+
306222
## 更多教程文档
307223

308224
### [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy)

0 commit comments

Comments
 (0)