一个 flask web 应用,有很多数据库操作 method,大部分 commit 是如下,想问下大家会怎么去服用
# ...
try:
session.add(sth)
session.commit()
except Exception as e:
session.rollback()
raise e
我的一些想法
函数调用,感觉不是很好
装...装饰器
google 搜索到有人用 with 关键字实现,似乎还不错
在一个基类里面做一些强制措施
1
MintZX 2021-07-18 09:12:59 +08:00
2 4 都行啊
|
2
ericls 2021-07-18 09:15:18 +08:00
为什么 function 不好?
|
3
learningman 2021-07-18 10:25:33 +08:00 1
with 最好了,自己重载一个 ContextManager
|
4
christopheredwar 2021-07-18 10:39:14 +08:00
是 sqlalchemy 麽,可以封装成一个函数,传 kwargs,往里传参数就好。
|
5
xiaoxinxiaobai 2021-07-18 10:51:55 +08:00 via Android
放 exception handler 中统一处理
|
6
hsfzxjy 2021-07-18 11:06:04 +08:00 via Android 1
写成 contextmanager
|
8
plko345 OP @christopheredwar 是,你说的是第一种吗?
|
9
plko345 OP @xiaoxinxiaobai 要怎么做,能否举个例子
|
10
BBCCBB 2021-07-18 13:33:30 +08:00
with 或者 装饰器 ==, 可以搞成 java spring 事务这种方式.
|
11
expkzb 2021-07-18 14:34:37 +08:00 via Android
放到 function 里不是挺好的,也就 sth 一个参数,再抛出一个 e 就行了
|
12
ipwx 2021-07-18 14:37:53 +08:00 2
1 2 3 4 都行
---- 抛砖引玉,1: def auto_commit(session, f): ....try: ........ret = f() ....except Exception: ........session.rollback() ........raise ....else: ........session.commit() ........return ret auto_commit(session, lambda: session.add(sth)) 2: from functools import wraps def auto_commit(f): ....@wraps(f) ....def wrapper(session, *args, **kwargs): ........try: ............ret = f(session) ........except Exception: ............session.rollback() ............raise ........else: ............session.commit() ............return ret ....return wrapper @auto_commit def my_fn(session): ........session.add(sth) my_fn(session) |
13
ipwx 2021-07-18 14:39:04 +08:00
3:
from contextlib import contextmanager @contextmanager def auto_commit(session): ....try: ........yield session ....except Exception: ........session.rollback() ........raise ....else: ........session.commit() with auto_commit(session): ....session.add(sth) |
14
Trim21 2021-07-18 14:52:39 +08:00 via Android
你的 session 如果不是自己封装的话很可能已经支持 with 了
|
17
Trim21 2021-07-18 14:59:39 +08:00
@plko345 #16 不知道你用得什么 ORM 框架,sqlalchemy 的话是这样的
with session.begin(): ....session.add(some_object) ....session.add(some_other_object) with 后面的代码块抛出了 exception 的话会自动 rollback |
19
skys215 2021-07-18 15:17:44 +08:00
没写过 flask
不是只有事务才需要用 commit ( mysql 级的)吗? |
20
vZexc0m 2021-07-19 10:13:07 +08:00 1
|