|
| 1 | +const { Client } = require("pg"); |
| 2 | + |
| 3 | +async function main() { |
| 4 | + const client = new Client({ |
| 5 | + host: process.env.PG_HOST, |
| 6 | + port: Number(process.env.PG_PORT), |
| 7 | + user: "testuser", |
| 8 | + password: "testpass", |
| 9 | + database: "testdb", |
| 10 | + }); |
| 11 | + |
| 12 | + await client.connect(); |
| 13 | + |
| 14 | + // Setup table |
| 15 | + await client.query( |
| 16 | + "CREATE TABLE IF NOT EXISTS test_prepared (id SERIAL PRIMARY KEY, value TEXT, num INTEGER)", |
| 17 | + ); |
| 18 | + |
| 19 | + // Named prepared statement: insert |
| 20 | + await client.query({ |
| 21 | + name: "insert-row", |
| 22 | + text: "INSERT INTO test_prepared (value, num) VALUES ($1, $2)", |
| 23 | + values: ["alpha", 1], |
| 24 | + }); |
| 25 | + |
| 26 | + // Reuse same named prepared statement (exercises prepared statement cache) |
| 27 | + await client.query({ |
| 28 | + name: "insert-row", |
| 29 | + text: "INSERT INTO test_prepared (value, num) VALUES ($1, $2)", |
| 30 | + values: ["beta", 2], |
| 31 | + }); |
| 32 | + |
| 33 | + await client.query({ |
| 34 | + name: "insert-row", |
| 35 | + text: "INSERT INTO test_prepared (value, num) VALUES ($1, $2)", |
| 36 | + values: ["gamma", 3], |
| 37 | + }); |
| 38 | + |
| 39 | + // Named prepared statement: select |
| 40 | + const res1 = await client.query({ |
| 41 | + name: "select-by-value", |
| 42 | + text: "SELECT id, value, num FROM test_prepared WHERE value = $1", |
| 43 | + values: ["beta"], |
| 44 | + }); |
| 45 | + |
| 46 | + // Reuse named select |
| 47 | + const res2 = await client.query({ |
| 48 | + name: "select-by-value", |
| 49 | + text: "SELECT id, value, num FROM test_prepared WHERE value = $1", |
| 50 | + values: ["gamma"], |
| 51 | + }); |
| 52 | + |
| 53 | + // Named prepared statement: select all ordered |
| 54 | + const resAll = await client.query({ |
| 55 | + name: "select-all-ordered", |
| 56 | + text: "SELECT value, num FROM test_prepared ORDER BY num ASC", |
| 57 | + values: [], |
| 58 | + }); |
| 59 | + |
| 60 | + // Named prepared statement: update |
| 61 | + await client.query({ |
| 62 | + name: "update-num", |
| 63 | + text: "UPDATE test_prepared SET num = $1 WHERE value = $2", |
| 64 | + values: [99, "alpha"], |
| 65 | + }); |
| 66 | + |
| 67 | + // Reuse named select to verify update |
| 68 | + const resUpdated = await client.query({ |
| 69 | + name: "select-by-value", |
| 70 | + text: "SELECT id, value, num FROM test_prepared WHERE value = $1", |
| 71 | + values: ["alpha"], |
| 72 | + }); |
| 73 | + |
| 74 | + // Named prepared statement: delete |
| 75 | + await client.query({ |
| 76 | + name: "delete-by-value", |
| 77 | + text: "DELETE FROM test_prepared WHERE value = $1", |
| 78 | + values: ["gamma"], |
| 79 | + }); |
| 80 | + |
| 81 | + // Verify deletion with reused select-all |
| 82 | + const resAfterDelete = await client.query({ |
| 83 | + name: "select-all-ordered", |
| 84 | + text: "SELECT value, num FROM test_prepared ORDER BY num ASC", |
| 85 | + values: [], |
| 86 | + }); |
| 87 | + |
| 88 | + // Cleanup |
| 89 | + await client.query("DROP TABLE test_prepared"); |
| 90 | + await client.end(); |
| 91 | + |
| 92 | + console.log( |
| 93 | + JSON.stringify({ |
| 94 | + inserted: 3, |
| 95 | + selectBeta: { rowCount: res1.rowCount, value: res1.rows[0].value, num: res1.rows[0].num }, |
| 96 | + selectGamma: { rowCount: res2.rowCount, value: res2.rows[0].value, num: res2.rows[0].num }, |
| 97 | + selectAll: resAll.rows.map((r) => ({ value: r.value, num: r.num })), |
| 98 | + updated: { value: resUpdated.rows[0].value, num: resUpdated.rows[0].num }, |
| 99 | + afterDelete: resAfterDelete.rows.map((r) => ({ value: r.value, num: r.num })), |
| 100 | + }), |
| 101 | + ); |
| 102 | +} |
| 103 | + |
| 104 | +main().catch((err) => { |
| 105 | + console.error(err.message); |
| 106 | + process.exit(1); |
| 107 | +}); |
0 commit comments