目前正在使用 sqlalchemy 和 fastapi 作为 AWS 中托管的生产微服务。问题是我们的生产数据库机密每 30 天刷新一次。尝试从机密管理器自动获取新机密,以便在 sqlalchemy 出现错误或操作错误时重新初始化数据库引擎和会话。我的问题是这种“重新初始化”应该发生在哪里?
utils/secret_mgr.py
import json
import logging
import boto3
from botocore.exceptions import ClientError
def get_secret(secret_id):
session = boto3.client('secretsmanager', region_name='us-east-1')
try:
response = session.get_secret_value(SecretId=secret_id)
except ClientError as e:
code = e.response['Error']['Code']
logging.exception(f'error:get_secret error_code:{code}')
raise e
else:
secret_str = response['SecretString']
secret = json.loads(secret_str)
return secret
Run Code Online (Sandbox Code Playgroud)
实用程序/db.py
import logging
import os
from sqlalchemy.pool import QueuePool
from sqlalchemy.sql import text
from sqlmodel import SQLModel, Session, create_engine
from sqlalchemy.exc import OperationalError
from api.utils.scemgr import get_secret
engine …
Run Code Online (Sandbox Code Playgroud) 将函数应用于极坐标数据帧pl.DataFrame
或极坐标数据帧的最快方法是什么pl.internals.lazy_frame.LazyFrame
?这个问题是对 Polars-DataFrame 的所有列应用函数的附带条件
我正在尝试使用 python 标准库中的 hashlib 连接所有列并散列值。我正在使用的功能如下:
import hashlib
def hash_row(row):
os.environ['PYTHONHASHSEED'] = "0"
row = str(row).encode('utf-8')
return hashlib.sha256(row).hexdigest()
Run Code Online (Sandbox Code Playgroud)
然而,鉴于此函数需要一个字符串作为输入,这意味着此函数需要应用于 pl.Series 中的每个单元格。处理少量数据应该没问题,但是当我们的行数接近 100m 时,这就变得非常有问题。该主题的问题是我们如何才能在整个 Polars 系列中以最高性能的方式应用这样的函数?
提供了一些创建新列的选项,其中一些比其他列性能更高。
df['new_col'] = df['some_col'] * 100 # vectorized calls
Run Code Online (Sandbox Code Playgroud)
另一种选择是为行操作创建自定义函数。
def apply_func(row):
return row['some_col'] + row['another_col']
df['new_col'] = df.apply(lambda row: apply_func(row), axis=1) # using apply operations
Run Code Online (Sandbox Code Playgroud)
根据我的经验,最快的方法是创建 numpy 矢量化解决方案。
import numpy as np
def np_func(some_col, another_col):
return some_col + another_col
vec_func = np.vectorize(np_func)
df['new_col'] = vec_func(df['some_col'].values, …
Run Code Online (Sandbox Code Playgroud)