
一个 flask web 应用,有很多数据库操作 method,大部分 commit 是如下,想问下大家会怎么去服用
# ... try: session.add(sth) session.commit() except Exception as e: session.rollback() raise e 我的一些想法
函数调用,感觉不是很好
装...装饰器
google 搜索到有人用 with 关键字实现,似乎还不错
在一个基类里面做一些强制措施
1 MintZX Jul 18, 2021 2 4 都行啊 |
2 ericls Jul 18, 2021 为什么 function 不好? |
3 learningman Jul 18, 2021 with 最好了,自己重载一个 ContextManager |
4 |
5 xiaoxinxiaobai Jul 18, 2021 via Android 放 exception handler 中统一处理 |
6 hsfzxjy Jul 18, 2021 via Android 写成 contextmanager |
8 plko345 OP @christopheredwar 是,你说的是第一种吗? |
9 plko345 OP @xiaoxinxiaobai 要怎么做,能否举个例子 |
10 BBCCBB Jul 18, 2021 with 或者 装饰器 ==, 可以搞成 java spring 事务这种方式. |
nbsp; 11 expkzb Jul 18, 2021 via Android 放到 function 里不是挺好的,也就 sth 一个参数,再抛出一个 e 就行了 |
12 ipwx Jul 18, 2021 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 Jul 18, 2021 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 Jul 18, 2021 via Android 你的 session 如果不是自己封装的话很可能已经支持 with 了 |
17 Trim21 Jul 18, 2021 @plko345 #16 不知道你用得什么 ORM 框架,sqlalchemy 的话是这样的 with session.begin(): ....session.add(some_object) ....sssion.add(some_other_object) with 后面的代码块抛出了 exception 的话会自动 rollback |
19 skys215 Jul 18, 2021 没写过 flask 不是只有事务才需要用 commit ( mysql 级的)吗? |
20 vZexc0m Jul 19, 2021 |