oguimbal / pg-mem

An in memory postgres DB instance for your unit tests

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Support queries with parameters

mmkal opened this issue · comments

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.

+1 on this.

There is some code that does exactly this in this repo already:

function replaceQueryArgs$(this: void, sql: string, values: any[]) {

Maybe just export that as a common util?