<p>Here's a quiet truth about data grids: the grid is never the hard part. The database behind it is. You build a beautiful table on top of MySQL, ship it, and six months later someone asks for a dashboard over a billion analytics events — and suddenly your grid, so happy on MySQL, is the bottleneck. The honest answer used to be "rewrite the data layer."</p><p>Elyra DataGrid 0.3 has a nicer answer: change one word.</p><pre><code class="language-php">Grid::table('events')-&gt;driver('clickhouse');
</code></pre><p>That's the whole story of this release. The grid learned to speak more than one dialect — so you can put the right database behind it without touching a single line of your columns, filters, editing, or frontend.</p><h2>Why this matters</h2><p>Every database is good at something different. ElyraSQL gives you single-pass facets and semantic search. ClickHouse chews through analytical aggregates like they're nothing. SQLite (and its replication-ready cousin, SQL Anywhere) is perfect for embedded, edge, and read-replica scenarios. MySQL is just... everywhere.</p><p>Before 0.3, the grid assumed one dialect. Now it has a small, honest driver layer: each backend knows how to speak its own SQL, and degrades gracefully where a feature isn't native. You declare your columns once. You write your filters once. The grid figures out the rest.</p><p>The same <code>contains "50%"</code> filter compiles to <code>LIKE ? ESCAPE '\\'</code> on MySQL, <code>LIKE ? ESCAPE '\'</code> on SQLite (whose string literals don't unescape backslashes), and plain <code>LIKE ?</code> on ClickHouse (which escapes backslashes intrinsically). You never think about any of that. That's the point.</p><h2>How it looks</h2><p>Same grid definition, four backends:</p><pre><code class="language-php">// Analytics dashboard — ClickHouse
Grid::table('events')-&gt;driver('clickhouse')-&gt;connection('clickhouse')
    -&gt;column('revenue', type: 'number', aggregatable: true);
// percentiles → quantile(0.95)(revenue), median → median(revenue),
// distinct → uniqExact(...), subtotals → GROUP BY … WITH ROLLUP

// Embedded / edge / replica — SQLite or SQL Anywhere
Grid::table('reports')-&gt;driver('sqlite')-&gt;connection('sqlite');
Grid::table('reports')-&gt;driver('sqlanywhere');   // SQLite-compatible engine

// The classics
Grid::table('sales')-&gt;driver('mysql');            // any MySQL server
Grid::table('sales')-&gt;driver('elyrasql');         // the flagship (default)
</code></pre><p>Each driver advertises what it can do, and the engine adapts:</p><pre><code class="language-text">                    ElyraSQL           ClickHouse    MySQL      SQLite / SQL Anywhere
Facets              single-pass        GROUP BY      GROUP BY   GROUP BY
                    FACET()
Percentiles         ✅                 ✅ quantile   —          —
Roll-up subtotals   ✅                 ✅            ✅         —
Full-text / hybrid  ✅                 —             ✅ MATCH   —
</code></pre><p>No feature disappears silently — an unsupported aggregate throws a clear exception, and everything else (sorting, filtering, paging, grouping, editing, streamed export) just works. Verified end-to-end: we exported a string-keyed SQLite table and ran full aggregate/facet/group queries against a live SQLite database, watching <code>backend: sqlite</code> come back in the timing.</p><h2>Trees, everywhere now</h2><p>0.3 also closes a nagging gap. The Vue and Svelte clients had a tree grid — self-referencing parent/child rows with lazy-loaded children — but Livewire didn't. Now it does, and it's one property:</p><pre><code class="language-php">class OrgGrid extends DataGrid
{
    public bool|array $tree = [
        'parentField' =&gt; 'parent_id',
        'rootValue' =&gt; 0,
        'hasChildrenField' =&gt; 'has_children',
    ];
}
</code></pre><p>Roots load first; expanding a node fetches its children (one query per open node) and slots them in with the right indentation and a chevron in the first column. Collapse, expand, drill three levels deep — it just flattens the visible tree on the server each render. All three clients now do hierarchies the same way.</p><h2>The unglamorous half (the part that makes it trustworthy)</h2><p>A release you'd actually run in production is mostly the boring stuff done right. 0.3 quietly landed a full hardening pass:</p><ul><li><p><strong>Bulk mutations.</strong> Batch-saving 50 edited rows or pasting a block from Excel used to fire 50 sequential HTTP calls. Now, with an optional <code>mutateBatch</code>, it's one request, one transaction — with a clean rollback if something's denied.</p></li><li><p><strong>Exports that don't fall over.</strong> Streaming export moved to standard keyset pagination (<code>WHERE key &gt; ? ORDER BY key LIMIT n</code>) — correct for string/UUID keys, gap-skipping, and flat memory. (ElyraSQL keeps its bounded key-windows, since it can't stream an unbuffered cursor.)</p></li><li><p><strong>Search that doesn't scan everything.</strong> A search for <code>%</code> or <code>_</code> is now escaped, so it matches literally instead of quietly turning into an all-rows table scan.</p></li><li><p><strong>Clipboard that doesn't corrupt.</strong> Copying cells with tabs or newlines now RFC-4180-quotes them, so pasting into Sheets — or back into the grid — never shifts a column.</p></li><li><p><strong>Calmer scrolling &amp; cleaner teardown.</strong> Fast virtual scrolling debounces into a single fetch, and <code>destroy()</code> now cancels pending timers and drops subscriptions, so nothing fires after a component unmounts.</p></li></ul><p>None of these make a demo gasp. All of them make the difference between "nice prototype" and "I trust this with our data."</p><h2>Bring your own database</h2><p>That's Elyra DataGrid 0.3. The grid you already know — columns, filters, inline/batch editing, grouping, virtual scroll, natural-language "ask the grid," export — now sitting comfortably on top of whichever database the job calls for. Start on SQLite locally, run ClickHouse for the analytics view, keep ElyraSQL for the flagship search experience. Same protocol, same three clients, same code.</p><p>Change one word. Keep everything else.</p><pre><code class="language-bash">composer require elyra/datagrid-server:^0.3
</code></pre><p>Full driver matrix and connection notes in the Defining grids guide.</p>