Skip to content

Commit

Permalink
Fix inconsistent results from raw SQL (#11091)
Browse files Browse the repository at this point in the history
* Fix inconsistent results from raw SQL

* Remove .only

* Fix

* Update packages/db/src/runtime/db-client.ts

Co-authored-by: Ben Holmes <hey@bholmes.dev>

---------

Co-authored-by: Ben Holmes <hey@bholmes.dev>
  • Loading branch information
matthewp and bholmesdev authored May 21, 2024
1 parent b78e83f commit e14ce57
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/honest-shirts-sell.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@astrojs/db": patch
---

Fix inconsistent result type using raw SQL
18 changes: 17 additions & 1 deletion packages/db/src/runtime/db-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,23 @@ export function createRemoteDatabaseClient(appToken: string, remoteDbURL: string
});
}

if (method === 'run') return remoteResult;
if (method === 'run') {
const rawRows = Array.from(remoteResult.rows);
// Implement basic `toJSON()` for Drizzle to serialize properly
(remoteResult as any).rows.toJSON = () => rawRows;
// Using `db.run()` drizzle massages the rows into an object.
// So in order to make dev/prod consistent, we need to do the same here.
// This creates an object and loops over each row replacing it with the object.
for(let i = 0; i < remoteResult.rows.length; i++) {
let row = remoteResult.rows[i];
let item: Record<string, any> = {};
remoteResult.columns.forEach((col, index) => {
item[col] = row[index];
});
(remoteResult as any).rows[i] = item;
}
return remoteResult;
}

// Drizzle expects each row as an array of its values
const rowValues: unknown[][] = [];
Expand Down
17 changes: 17 additions & 0 deletions packages/db/test/fixtures/static-remote/src/pages/run.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
import { User, db, sql } from 'astro:db';
const results = await db.run(sql`SELECT 1 as value`);
const row = results.rows[0];
---

<html>
<head>
<title>Testing</title>
</head>
<body>
<h1>Testing</h1>

<span id="row">{row.value}</span>
</body>
</html>
7 changes: 7 additions & 0 deletions packages/db/test/static-remote.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,12 @@ describe('astro:db', () => {

expect($('li').length).to.equal(1);
});

it('Returns correct shape from db.run()', async () => {
const html = await fixture.readFile('/run/index.html');
const $ = cheerioLoad(html);

expect($('#row').text()).to.equal('1');
});
});
});

0 comments on commit e14ce57

Please sign in to comment.