# Buggy code
def init(db_url: str, clean_open_orders: bool = False) -> None:
    """
    Initializes this module with the given config,
    registers all known command handlers
    and starts polling for message updates
    :param db_url: Database to use
    :param clean_open_orders: Remove open orders from the database.
        Useful for dry-run or if all orders have been reset on the exchange.
    :return: None
    """
    kwargs = {}

    # Take care of thread ownership if in-memory db
    if db_url == "sqlite://":
        kwargs.update(
            {
                "connect_args": {"check_same_thread": False},
                "poolclass": StaticPool,
                "echo": False,
            }
        )

    try:
        engine = create_engine(db_url, **kwargs)
    except NoSuchModuleError:
        raise OperationalException(
            f"Given value for db_url: '{db_url}' "
            f"is no valid database URL! (See {_SQL_DOCS_URL})"
        )

    session = scoped_session(sessionmaker(bind=engine, autoflush=True, autocommit=True))
    Trade.session = session()
    Trade.query = session.query_property()
    _DECL_BASE.metadata.create_all(engine)
    check_migrate(engine)

    # Clean dry_run DB if the db is not in-memory
    if clean_open_orders and db_url != "sqlite://":
        clean_dry_run_db()


# 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 init(db_url: str, clean_open_orders: bool = False) -> None:
    """
    Initializes this module with the given config,
    registers all known command handlers
    and starts polling for message updates
    :param db_url: Database to use
    :param clean_open_orders: Remove open orders from the database.
        Useful for dry-run or if all orders have been reset on the exchange.
    :return: None
    """
    kwargs = {}

    # Take care of thread ownership if in-memory db
    if db_url == "sqlite://":
        kwargs.update(
            {
                "connect_args": {"check_same_thread": False},
                "poolclass": StaticPool,
                "echo": False,
            }
        )

    try:
        engine = create_engine(db_url, **kwargs)
    except NoSuchModuleError:
        raise OperationalException(
            f"Given value for db_url: '{db_url}' "
            f"is no valid database URL! (See {_SQL_DOCS_URL})"
        )

    # https://docs.sqlalchemy.org/en/13/orm/contextual.html#thread-local-scope
    # Scoped sessions proxy requests to the appropriate thread-local session.
    # We should use the scoped_session object - not a seperately initialized version
    Trade.session = scoped_session(
        sessionmaker(bind=engine, autoflush=True, autocommit=True)
    )
    Trade.query = Trade.session.query_property()
    _DECL_BASE.metadata.create_all(engine)
    check_migrate(engine)

    # Clean dry_run DB if the db is not in-memory
    if clean_open_orders and db_url != "sqlite://":
        clean_dry_run_db()