
一个 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 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 写成 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 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 |