当前位置: 首页 > news >正文

建网站哪家好新闻广州万户网站公司

建网站哪家好新闻,广州万户网站公司,手机网站模板制作教程,创建小程序的流程最近使用它交互数据库,想实现类似java aop那种自动事务控制,不用手动commit或者rollback。我是用的是flaskdenpendency-injecter 这是我的db的配置类,里面会初始化一些session配置,里面比较重要的是把autocommit和autoflush关闭了…

最近使用它交互数据库,想实现类似java aop那种自动事务控制,不用手动commit或者rollback。我是用的是flask+denpendency-injecter

 这是我的db的配置类,里面会初始化一些session配置,里面比较重要的是把autocommit和autoflush关闭了,因为我们的代码会来处理这个,还有就是把expire_on_commit设置为flase,否则你commit之后,再取用某个entity就会报错了,例如你新建了一个entity,这个时候会更新他的id,返回给前端的时候就会报错了(Error Messages — SQLAlchemy 2.0 Documentation)。

"""Database module."""from contextlib import contextmanager, AbstractContextManager
from typing import Callablefrom sqlalchemy import create_engine, orm
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session
Base = declarative_base()class DatabaseConfig:def __init__(self, db_url: str) -> None:self._engine = create_engine(db_url, echo=True)self._session_factory = orm.scoped_session(orm.sessionmaker(autocommit=False,autoflush=False,expire_on_commit=False,bind=self._engine,),)def create_database(self) -> None:Base.metadata.create_all(self._engine)@contextmanagerdef session(self) -> Callable[..., AbstractContextManager[Session]]:session: Session = self._session_factory()try:yield sessionexcept Exception:session.rollback()raiseelse:if session._transaction.is_active:session.commit()session.close()

然后comtextmanger里面就是我们的处理代码了,我们主要依靠with代码块来控制,在yield之前的属于__init__,在yield之后属于__exit__,也就是当with代码块结束之前,如果发生任何报错,我们都会进行rollback操作,并且raise(这部分需要error handler来做了,这里就不赘述了),然后如果什么错误都没有发生,就检测transaction是否还是active,如果是就commit,然后关闭session。

 然后在Container中注入session contextmanager。

class Container(containers.DeclarativeContainer):wiring_config = containers.WiringConfiguration(packages=["main"])config = providers.Configuration(yaml_files=["config.yml"])db=providers.Singleton(DatabaseConfig,db_url=config.db.url)user_repository = providers.Factory(UserRepositoryImpl)user_service = providers.Factory(UserService,user_repository=user_repository,session_factory=db.provided.session)

然后再service层使用with代码块控制transation ,整个逻辑包含在同一个with中就行了。

class UserService:@injectdef __init__(self, user_repository: UserRepository, session_factory: Callable[..., AbstractContextManager[Session]]) -> None:self._repository: UserRepository = user_repositoryself.session_factory=session_factorydef create_user(self,user) -> User:with self.session_factory() as session:return self._repository.add(session=session,user=user)

然后在repo里面写具体代码就行了

class UserRepositoryImpl(UserRepository):def __init__(self) -> None:passdef add(self, user,session):session.add(user)return user

http://www.15wanjia.com/news/157071.html

相关文章:

  • 常州网站seophp.ini wordpress
  • 免费微网站开发网页广告投放
  • 汕头网站建设网站手机摄影网站首页
  • 企业网站添加栏目2023年中国500强企业
  • 购物网站建设目标概述深圳网页制作招聘网
  • 建站专业的推广服务平台南京百度seo代理
  • 怎样创建网站域名平台WordPress文章图片怎么上传
  • 河南推广网站的公司快应用
  • 国外购物网站推荐wordpress 新标签打开
  • app 网站 区别英文网站建设哪家强
  • 湘潭网站建设磐石网络上班时间湛江市研发网站建设
  • 班级同学录网站建设代运营哪家公司最正规
  • 怎么做网站优化 s惠州制作网站软件
  • 南昌制作网站的公司吗扬中网站设计公司
  • 怎么用宝塔做网站做的网站没有手机版
  • 旅游网站设计策划书免费自建网站
  • 企业备案做电影网站的后果广州市南沙建设局网站
  • 做网站移动端建多大尺寸网站在布局
  • js实现网站浮动窗口网站前期准备
  • 网站开发主要学什么湖南长沙旅游攻略
  • 仙游h5做网站163企业邮箱下载
  • 红色系 网站织梦网站tel标签
  • 简述dw网站开发流程wordpress怎么增加语言
  • 动态ip上做网站免费发布信息网站平台
  • 网站换模板影响许昌网站建设汉狮套餐
  • 网站备案被拒菜谱网站开发
  • 深圳市建设工程造价管理站百度视频
  • 手机网站设计只找亿企邦属于网站设计内容的是
  • seo网站设计外包晚上偷偷奖励自己的软件
  • 一个网站的制作流程网站开发研发合同