Минимализм SQLAlchemy — передача списка и распаковка

Admin SQLAlchemy

Как передавать разные параметры в SQLAlchemy и распаковать их. Как одновременно создать объект в SQLAlchemy, а если он создан, то обновить объект. Как передавать любые параметры при этом не создавая много одинаковых функций.

Ниже приведены несколько вариантов длинного кода, но сокращение для всех применяется одно и то же.

Сокращение при создании и обновлении БД

Вместо увеличения списка параметров:

query = db.session.query(Result).filter_by(user_id=user_id, date=date).first()
if not query:
    new = Result(
    rub=balance['rub'],
    usd=balance['usd'],
    time=balance['time'],
    )
else:
    db.session.query(Result).filter_by(user_id=user_id, date=date).update(
    {
        'rub': balance['rub'],
        'usd': balance['usd'],
        'time': balance['time'],
    })
db.session.commit()

Можно сделать так:

def update_results(user_id, balance):
    balance['user_id'] = user_id
    balance['updated_at'] = datetime.utcnow()

    query = db.session.query(Result).filter_by(user_id=user_id, date=balance['date']).first()
    if not query:
        new = Result(**balance)
        db.session.add(new)
    else:
        for key, value in balance.items():
            setattr(query, key, value)
    db.session.commit()

Сокращение при создании нового объекта

Вместо:

def add_new_balance_assets(
        user_id: int, portfolio_id: int, instrument_type: str, currency: str,
        quantity: float
):
    new = BalanceAssets(
        user_id=user_id,
        portfolio_id=portfolio_id,
        instrument_type=instrument_type,
        currency=currency,
        quantity=quantity
    )
    db.session.add(new)

Это:

def add_new_balance_assets(balance):
    new = BalanceAssets(**balance)
    db.session.add(new)

Сокращение при обновлении объекта

Вместо:

def update_balance(user_id, id_, date_time, description, sum_in_rub):
    if date_time:
        db.session.query(Balance).filter_by(user_id=user_id, id=id_).update(
            {'date': date_time}
        )
    if description or description is None:
        db.session.query(Balance).filter_by(user_id=user_id, id=id_).update(
            {'description': description}
        )
    if sum_in_rub:
        db.session.query(Balance).filter_by(user_id=user_id, id=id_).update(
            {'sum_in_rub': sum_in_rub}

Так:

def update_balance(balance):
    query = db.session.query(Balance).filter_by(user_id=balance['user_id'], id=balance['id']).first()
    for key, value in balance.items():
        setattr(query, key, value)
    db.session.commit()

У сайта нет цели самоокупаться, поэтому на сайте нет рекламы. Но если вам пригодилась информация, можете лайкнуть страницу, оставить комментарий или отправить мне подарок на чашечку кофе.

Добавить комментарий

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи:
"Минимализм SQLAlchemy — передача списка и распаковка"