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:

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()

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()

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *