{"id":43565,"library":"pg-mem","title":"pg-mem","description":"pg-mem v3.0.14 is an experimental in-memory emulation of a PostgreSQL database for Node.js and browser environments, released under active development with weekly commits. It supports SQL syntax parsing via a custom parser (pgsql-ast-parser), provides adapters for popular ORMs/query builders such as TypeORM, MikroORM, Knex, Kysely, pg-promise, Slonik, and postgres.js, and offers unique features like immutable restore points for zero-cost rollback in unit tests. Key differentiators include browser compatibility, custom function registration, and no native dependencies. However, it is not a full PostgreSQL replacement; many advanced features are missing (e.g., some data types, triggers, window functions) and the SQL parser may reject valid PostgreSQL syntax. It ships TypeScript types and is primarily used for testing and development.","status":"active","version":"3.0.14","language":"javascript","source_language":"en","source_url":"https://github.com/oguimbal/pg-mem","tags":["javascript","postgres","pg-mock","mock","memory","db","database","pg","typeorm","typescript"],"install":[{"cmd":"npm install pg-mem","lang":"bash","label":"npm"},{"cmd":"yarn add pg-mem","lang":"bash","label":"yarn"},{"cmd":"pnpm add pg-mem","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"Optional adapter for TypeORM integration","package":"typeorm","optional":true},{"reason":"Optional adapter for MikroORM integration","package":"@mikro-orm/core","optional":true},{"reason":"Optional adapter for MikroORM PostgreSQL driver","package":"@mikro-orm/postgresql","optional":true},{"reason":"Optional adapter for Knex query builder","package":"knex","optional":true},{"reason":"Optional adapter for Kysely query builder","package":"kysely","optional":true},{"reason":"Optional adapter for pg-promise","package":"pg-promise","optional":true},{"reason":"Optional adapter for Slonik","package":"slonik","optional":true},{"reason":"Optional adapter for postgres.js","package":"postgres","optional":true},{"reason":"Optional adapter for pg-server","package":"pg-server","optional":true}],"imports":[{"note":"ESM-only since v3; named import required.","wrong":"const pgmem = require('pg-mem'); const db = pgmem.newDb()","symbol":"newDb","correct":"import { newDb } from 'pg-mem'"},{"note":"Named export, not default.","wrong":"import DataType from 'pg-mem'","symbol":"DataType","correct":"import { DataType } from 'pg-mem'"},{"note":"Type import for TypeScript; only available since v3.","symbol":"IDb","correct":"import type { IDb } from 'pg-mem'"}],"quickstart":{"code":"import { newDb } from 'pg-mem';\n\nconst db = newDb();\ndb.public.none(`CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT NOT NULL)`);\ndb.public.none(`INSERT INTO users (name) VALUES ('Alice'), ('Bob')`);\nconst rows = db.public.many(`SELECT * FROM users`);\nconsole.log(rows); // [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]\n\n// Create restore point and rollback\nconst backup = db.backup();\ndb.public.none(`UPDATE users SET name = 'Charlie' WHERE id = 1`);\nbackup.restore();\nconst afterRestore = db.public.many(`SELECT * FROM users`);\nconsole.log(afterRestore); // [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]","lang":"typescript","description":"Creates an in-memory database, runs SQL schema and inserts, queries data, then demonstrates restore point rollback."},"warnings":[{"fix":"Before relying on pg-mem, test your SQL against it. For unsupported features, consider filing an issue or using alternative mocking strategies.","message":"pg-mem does not implement all PostgreSQL features; some SQL syntax or functions may fail silently or throw unexpected errors.","severity":"gotcha","affected_versions":">=0.0.0"},{"fix":"Switch to ES module imports: import { newDb } from 'pg-mem'.","message":"In v3, the package is ESM-only. Using require() will fail.","severity":"breaking","affected_versions":">=3.0.0"},{"fix":"Use named imports: import { newDb, DataType, IDb } from 'pg-mem'.","message":"The default export was removed in v3; only named exports are available.","severity":"breaking","affected_versions":">=3.0.0"},{"fix":"Always use the same db instance for restore points.","message":"Restore points are only valid within the same db session; creating a second db instance will not share restore points.","severity":"gotcha","affected_versions":">=0.0.0"},{"fix":"Ensure the implementation returns a value compatible with the declared DataType.","message":"Custom function return values are not type-checked; returning an incompatible type can cause runtime errors.","severity":"gotcha","affected_versions":">=0.0.0"}],"env_vars":null,"search_vec":"'activ':26 'adapt':45 'advanc':99 'ast':42 'browser':22,81 'builder':49 'commit':30 'compat':82 'cost':73 'custom':38,83 'data':105 'databas':18,139 'db':138 'depend':89 'develop':27,130 'differenti':79 'e.g':103 'emul':14 'environ':23 'experiment':10 'featur':65,100 'full':95 'function':84,109 'howev':90 'immut':67 'in-memori':11 'includ':80 'javascript':131 'key':78 'knex':54 'kyse':55 'like':66 'mani':98 'may':114 'mem':3,6 'memori':13,137 'mikroorm':53 'miss':102 'mock':135,136 'nativ':88 'node.js':20 'offer':63 'orms/query':48 'pars':35 'parser':39,43,113 'pg':2,5,57,134,140 'pg-mem':1,4 'pg-mock':133 'pg-promis':56 'pgsql':41 'pgsql-ast-pars':40 'point':69 'popular':47 'postgr':132 'postgres.js':61 'postgresql':17,96,117 'primarili':125 'promis':58 'provid':44 'registr':85 'reject':115 'releas':24 'replac':97 'restor':68 'rollback':74 'ship':120 'slonik':59 'sql':33,112 'support':32 'syntax':34,118 'test':77,128 'trigger':107 'type':106,122 'typeorm':52,141 'typescript':121,142 'uniqu':64 'unit':76 'use':126 'v3.0.14':7 'valid':116 'via':36 'week':29 'window':108 'zero':72 'zero-cost':71","created_at":"2026-06-05T17:00:24.654457+00:00","updated_at":"2026-06-05T17:00:24.654457+00:00","problems":[{"fix":"Change to named import: import { newDb } from 'pg-mem'","cause":"Using default import on ESM-only package v3","error":"TypeError: pg_mem_1.newDb is not a function"},{"fix":"Set type: 'module' in package.json or use dynamic import: const { newDb } = await import('pg-mem')","cause":"Using require() on ESM-only package","error":"SyntaxError: Unexpected token 'export'"},{"fix":"Simplify the SQL or split into multiple statements; consider using pgsql-ast-parser separately.","cause":"pg-mem's SQL parser does not recognize that statement","error":"Error: unsupported statement type: <some specific SQL>"}],"ecosystem":"npm","meta_description":null,"install_score":null,"quickstart_score":null,"quickstart_tag":null,"pypi_latest":null,"cli_name":null,"cli_version":null,"type":"library","homepage":"https://github.com/oguimbal/pg-mem#readme","github":"https://github.com/oguimbal/pg-mem","docs":null,"changelog":null,"pypi":null,"npm":"pg-mem","openapi_spec":null,"status_page":null,"smithery":null,"categories":["testing"],"base_url":null,"auth_type":null,"provenance":{"verified_status":null,"verified_at":null,"last_verified":"2026-06-05","next_check":"2026-09-03","install_tag":null}}