# Buggy code
def load_trades_from_db(db_url: str) -> pd.DataFrame:
    """
    Load trades from a DB (using dburl)
    :param db_url: Sqlite url (default format sqlite:///tradesv3.dry-run.sqlite)
    :return: Dataframe containing Trades
    """
    trades: pd.DataFrame = pd.DataFrame([], columns=BT_DATA_COLUMNS)
    persistence.init(db_url, clean_open_orders=False)

    columns = [
        "pair",
        "open_time",
        "close_time",
        "profit",
        "profitperc",
        "open_rate",
        "close_rate",
        "amount",
        "duration",
        "sell_reason",
        "fee_open",
        "fee_close",
        "open_rate_requested",
        "close_rate_requested",
        "stake_amount",
        "max_rate",
        "min_rate",
        "id",
        "exchange",
        "stop_loss",
        "initial_stop_loss",
        "strategy",
        "ticker_interval",
    ]

    trades = pd.DataFrame(
        [
            (
                t.pair,
                t.open_date.replace(tzinfo=pytz.UTC),
                t.close_date.replace(tzinfo=pytz.UTC) if t.close_date else None,
                t.calc_profit(),
                t.calc_profit_percent(),
                t.open_rate,
                t.close_rate,
                t.amount,
                (
                    round((t.close_date.timestamp() - t.open_date.timestamp()) / 60, 2)
                    if t.close_date
                    else None
                ),
                t.sell_reason,
                t.fee_open,
                t.fee_close,
                t.open_rate_requested,
                t.close_rate_requested,
                t.stake_amount,
                t.max_rate,
                t.min_rate,
                t.id,
                t.exchange,
                t.stop_loss,
                t.initial_stop_loss,
                t.strategy,
                t.ticker_interval,
            )
            for t in Trade.query.all()
        ],
        columns=columns,
    )

    return trades


# Traceback (sqlalchemy.exc.InvalidRequestError)
2019-06-30 03:51:36,539 - freqtrade.rpc.telegram - INFO - Executing handler: _forcebuy for chat_id: 146554112
2019-06-30 03:51:36,545 - freqtrade.freqtradebot - INFO - Using Last Ask / Last Price
2019-06-30 03:51:37,260 - freqtrade.rpc.rpc_manager - INFO - Sending rpc message: {'type': buy, 'exchange': 'Binance', 'pair': 'ALGO/USDT', 'limit': 1.5642505330623224, 'order_type': 'market', 'stake_amount': 13811.040136000001, 'stake_currency': 'USDT', 'fiat_currency': 'USD'}
2019-06-30 03:51:37,612 - freqtrade.freqtradebot - INFO - Found open order for Trade(id=None, pair=ALGO/USDT, amount=8829.17400000, open_rate=1.56425053, open_since=closed)
2019-06-30 03:51:37,758 - freqtrade.freqtradebot - WARNING - Amount 8829.173999999999 does not match amount 8829.174
2019-06-30 03:51:37,760 - freqtrade.freqtradebot - WARNING - Could not update trade amount: Half bought? Amounts don't match
2019-06-30 03:51:37,760 - freqtrade.persistence - INFO - Updating trade (id=None) ...
2019-06-30 03:51:37,760 - freqtrade.persistence - INFO - MARKET_BUY has been fulfilled for Trade(id=None, pair=ALGO/USDT, amount=8829.17400000, open_rate=1.56425053, open_since=closed).
2019-06-30 03:51:37,761 - freqtrade.rpc.telegram - ERROR - Exception occurred within Telegram module
Traceback (most recent call last):
File "/home/dante/freqtrade/freqtrade/rpc/telegram.py", line 52, in wrapper
return command_handler(self, *args, **kwargs)
File "/home/dante/freqtrade/freqtrade/rpc/telegram.py", line 433, in _forcebuy
self._rpc_forcebuy(pair, price)
File "/home/dante/freqtrade/freqtrade/rpc/rpc.py", line 432, in _rpc_forcebuy
if self._freqtrade.execute_buy(pair, stakeamount, price):
File "/home/dante/freqtrade/freqtrade/freqtradebot.py", line 416, in execute_buy
self.update_trade_state(trade, order)
File "/home/dante/freqtrade/freqtrade/freqtradebot.py", line 539, in update_trade_state
trade.update(order)
File "/home/dante/freqtrade/freqtrade/persistence.py", line 317, in update
cleanup()
File "/home/dante/freqtrade/freqtrade/persistence.py", line 155, in cleanup
Trade.session.flush()
File "/home/dante/.local/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2445, in flush
raise sa_exc.InvalidRequestError("Session is already flushing")
sqlalchemy.exc.InvalidRequestError: Session is already flushing

# Fixed code
def load_trades_from_db(db_url: str) -> pd.DataFrame:
    """
    Load trades from a DB (using dburl)
    :param db_url: Sqlite url (default format sqlite:///tradesv3.dry-run.sqlite)
    :return: Dataframe containing Trades
    """
    trades: pd.DataFrame = pd.DataFrame([], columns=BT_DATA_COLUMNS)
    persistence.init(db_url, clean_open_orders=False)

    columns = [
        "pair",
        "open_time",
        "close_time",
        "profit",
        "profitperc",
        "open_rate",
        "close_rate",
        "amount",
        "duration",
        "sell_reason",
        "fee_open",
        "fee_close",
        "open_rate_requested",
        "close_rate_requested",
        "stake_amount",
        "max_rate",
        "min_rate",
        "id",
        "exchange",
        "stop_loss",
        "initial_stop_loss",
        "strategy",
        "ticker_interval",
    ]

    trades = pd.DataFrame(
        [
            (
                t.pair,
                t.open_date.replace(tzinfo=pytz.UTC),
                t.close_date.replace(tzinfo=pytz.UTC) if t.close_date else None,
                t.calc_profit(),
                t.calc_profit_percent(),
                t.open_rate,
                t.close_rate,
                t.amount,
                (
                    round((t.close_date.timestamp() - t.open_date.timestamp()) / 60, 2)
                    if t.close_date
                    else None
                ),
                t.sell_reason,
                t.fee_open,
                t.fee_close,
                t.open_rate_requested,
                t.close_rate_requested,
                t.stake_amount,
                t.max_rate,
                t.min_rate,
                t.id,
                t.exchange,
                t.stop_loss,
                t.initial_stop_loss,
                t.strategy,
                t.ticker_interval,
            )
            for t in Trade.get_trades().all()
        ],
        columns=columns,
    )

    return trades