记录auditflow(见20260510)的pydantic和SQlAlchemy用法 今天主要记录配置加载和factory初始化部分
Pydantic
python
@field_validator("xxx", mode="before/after")
@classmethod
def _function(cls, v: str) -> str:
return
@field_validator,用于读取env文件中xxxbefore,在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参与的多了项目不像是自己的,得多审阅,静下心来好好看代码逻辑和设计,将其消化为自己的能力