SQLAlchemy Minimalism – List Passing and Unpacking
How to pass different parameters to SQLAlchemy and unpack them. How to simultaneously create an object in SQLAlchemy, and if it is created, then update the object. How to pass any parameters without creating many identical functions.
Below are several variants of the long code, but the abbreviation for all applies the same.
Reducing when creating and updating the database
Instead of increasing the parameter list:
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()
You can do this:
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()
Shortcut when creating a new object
Instead of:
def add_new_balance_assets(
userid: 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)
This:
def add_new_balance_assets(balance):
new = BalanceAssets(** balance)
db.session.add(new)
Shrink when updating an object
Instead of:
def update_balance(user_id, id_, date_time, description, sum_in_rub):
if datetime:
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}
So:
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()