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:
parent
b78e83f448
commit
e14ce5726d
4 changed files with 46 additions and 1 deletions
5
.changeset/honest-shirts-sell.md
Normal file
5
.changeset/honest-shirts-sell.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
"@astrojs/db": patch
|
||||
---
|
||||
|
||||
Fix inconsistent result type using raw SQL
|
|
@ -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[][] = [];
|
||||
|
|
17
packages/db/test/fixtures/static-remote/src/pages/run.astro
vendored
Normal file
17
packages/db/test/fixtures/static-remote/src/pages/run.astro
vendored
Normal 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>
|
|
@ -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');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Add table
Reference in a new issue