Как передавать разные параметры в 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()
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()
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)
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)
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}
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()
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()