oguimbal / pg-mem

An in memory postgres DB instance for your unit tests
MIT License
1.89k stars 94 forks source link

Support queries with parameters #384

Open mmkal opened 4 months ago

mmkal commented 4 months ago

Hi! Love pg-mem.

One thing that's a little awkward to do is to pass queries that have parameters to it (e.g., which have come from pg-promise or slonik similar).

So say I've got an object that looks like { sql: 'select * from foo where id = $1', values: ['abc'] } - I'd love to be able to pass them straight to pg-mem and have it work. (like db.public.query(myQuery.sql, myQuery.values)).

Right now I've got a terrible workaround which works for the very limited use-case I have so far, but I think it will break as soon as I do something more complex, so I'm thinking there's already a better way, or if not, there could be:

let statement = pgSqlAstParser.parse(query.sql)

statement = JSON.parse(JSON.stringify(statement), (key, value) => {
  if (value?.type === 'parameter' && typeof value?.name === 'string') {
    const literalValue = query.values[Number(value.name.slice(1)) - 1]
    return {type: 'string', value: literalValue}
  }
  return value
})

return fakeDb.public.query(statement)

If this is already possible, it can become a docs request.

taironoaky commented 4 months ago

+1 on this.

marcus13371337 commented 4 months ago

There is some code that does exactly this in this repo already: https://github.com/oguimbal/pg-mem/blob/bfd30a0321958e15ef2d9e0fd9696600a19fca4c/src/adapters/adapters.ts#L27

Maybe just export that as a common util?