20260511-Pydantic和SQLalchemy

记录auditflow(见20260510)的pydantic和SQlAlchemy用法 今天主要记录配置加载和factory初始化部分

Pydantic

python 复制代码
@field_validator("xxx", mode="before/after")
@classmethod
def _function(cls, v: str) -> str:
    return 
  • @field_validator,用于读取env文件中xxx
  • before,在pydantic加载xxx前调用,可用于规范大小写,检查是否合法等
  • after,在pydantic加载xxx后且被before处理后调用,可用info.data使用处理后的值
  • cls,validator所属的类
  • v,xxx原始字符
  • @model_validator,在整个模型的所有字段验证都完成后运行,接收完整的 self(已填充/已验证的模型实例)。适合跨字段组合或衍生字段(比如把多个 POSTGRES_* 组合成 database_url
python 复制代码
class _DictSettings(AppRuntimeSettings):
    model_config = SettingsConfigDict(
        env_file=None,
        env_ignore_empty=True,
        extra="ignore",
        populate_by_name=True,
    )

    @classmethod
    def settings_customise_sources(cls, settings_cls, init_settings, **kwargs):
        return (init_settings,)
  • SettingConfigDict,用来管理应用配置
  • setting_cls,当前正被构造的Setting类(_DictSettings)
  • init_settings,初始化参数配置源
  • **kwargs,捕获可能传入的其他参数

运行顺序:构造函数->settings_customise_sources->@field_validator("xxx", mode="before/after")->@model_validator(mode="after")

SQLalchemy

  • creat_engine:数据库连接引擎,不直接连接数据库,自带连接池和dialect(将SQLAlchemy代码翻译为特定数据库能看懂的语言)
  • sessionmaker:一个可调用的工厂,用于创建session(session用于orm增删改查操作)
  • DeclarativeBase:声明式映射基类,表结构直接继承该类,SQLAlchemy自动生成对应的Table对象,并简历类属性与数据库列的映射关系
  • Base.metadata.create_all(engine):创建所有表,多次安全调用,只会创建不存在的表,不会修改已存在表的列或约束
python 复制代码
@contextmanager
def session_scope(self):
    session: Session = self._sessionmaker()
    try:
        yield session
        session.commit()
    except Exception:
        session.rollback()
        raise
    finally:
        session.close()

可with调用,yield一个session,在session中做完操作后commit,出现异常进行回滚,执行完后关闭session

python 复制代码
@contextmanager
def transactional(self):
    """Yield a session for use across multiple repository calls in one transaction."""
    session: Session = self._sessionmaker()
    try:
        yield session
        session.commit()
    except Exception:
        session.rollback()
        raise
    finally:
        session.close()

和上面的代码一模一样,一个用来在单个session中执行单个sql,一个用来保证业务原子性,多个repository需要执行时在一个transcational中执行

  • session.get:使用主键获取对应表的信息
  • session.add:在表中插入数据

未完待续...

小结

AI coding参与的多了项目不像是自己的,得多审阅,静下心来好好看代码逻辑和设计,将其消化为自己的能力

相关推荐
有梦不弃3 小时前
模块化单体架构设计方案:DDD + 六边形架构落地实践
后端·架构
傻啦嘿哟3 小时前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
迷迭香yy4 小时前
集合竞价数据挖掘实战:用Python构建开盘信号识别系统
人工智能·python·数据挖掘
李昊哲小课6 小时前
fastapi sse websocket 奶茶店实时订单看板
人工智能·python·websocket·网络协议·fastapi·sse
江南十四行7 小时前
Spring框架核心(上)——IoC控制反转与DI依赖注入详解
java·后端·spring
IT_陈寒8 小时前
Redis缓存击穿把我坑惨了,原来这样设过期时间才靠谱
前端·人工智能·后端
妙码生花8 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十二):管理员权限检查中间件,AI 随意放行预闯大祸
前端·后端·go
创安电气研究所8 小时前
用 Node.js 将变频器运行数据接入 MQTT
后端
董员外8 小时前
RAG 系统进化论(八):Agentic RAG(智能体式 RAG),从回答问题到完成任务
人工智能·后端·设计模式
2401_844582958 小时前
工具包:软件架构设计的实用技巧与经验分享
python