0
Fork 0
mirror of https://github.com/withastro/astro.git synced 2025-01-27 22:19:04 -05:00

Fix inconsistent results from raw SQL (#11091)

* 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>
This commit is contained in:
Matthew Phillips 2024-05-21 17:12:39 -04:00 committed by GitHub
parent b78e83f448
commit e14ce5726d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 46 additions and 1 deletions

View file

@ -0,0 +1,5 @@
---
"@astrojs/db": patch
---
Fix inconsistent result type using raw SQL

View file

@ -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[][] = [];

View file

@ -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>

View file

@ -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');
});
});
});