Parameters
----------
_sessionmaker : a SQLAlchemy session factory. Because this arg name is
                prefixed with "_", it won't be hashed.
page_size : the number of rows in a page of result
page : the page number to retrieve
Returns
-------
pandas.DataFrame
A DataFrame containing the retrieved rows. Mutating it won't affect
the cache.
"""
with _sessionmaker() as session:
    query = (
        session
            .query(RNA.id, RNA.seq_short, RNA.seq_long, RNA.len, RNA.upi)
            .order_by(RNA.id)
            .offset(page_size * page)
            .limit(page_size)
    )
    return pd.read_sql(query.statement, query.session.bind)
```
@st.experimental_singleton
@st.experimental_singleton is a key-value store that's shared across all sessions of a Streamlit app. It's great for storing heavyweight singleton objects across sessions (like TensorFlow/Torch/Keras sessions and/or database connections).
