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
|
// Drizzle expects each row as an array of its values
|
||||||
const rowValues: unknown[][] = [];
|
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);
|
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