{"id":15067342,"url":"https://github.com/damirka/pg-bind","last_synced_at":"2025-04-10T14:12:20.911Z","repository":{"id":57322528,"uuid":"170692574","full_name":"damirka/pg-bind","owner":"damirka","description":"Zero-dependency tool for binding SQL queries in more native JS way","archived":false,"fork":false,"pushed_at":"2019-05-28T16:31:10.000Z","size":20,"stargazers_count":6,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-03T14:01:57.474Z","etag":null,"topics":["node-postgres","nodejs","postgres","postgresql","query","query-builder"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/pg-bind","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/damirka.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-02-14T13:07:05.000Z","updated_at":"2023-01-13T19:16:53.000Z","dependencies_parsed_at":"2022-08-25T21:01:12.140Z","dependency_job_id":null,"html_url":"https://github.com/damirka/pg-bind","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/damirka%2Fpg-bind","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/damirka%2Fpg-bind/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/damirka%2Fpg-bind/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/damirka%2Fpg-bind/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/damirka","download_url":"https://codeload.github.com/damirka/pg-bind/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248232581,"owners_count":21069487,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["node-postgres","nodejs","postgres","postgresql","query","query-builder"],"created_at":"2024-09-25T01:19:54.535Z","updated_at":"2025-04-10T14:12:20.870Z","avatar_url":"https://github.com/damirka.png","language":"JavaScript","readme":"# pg-bind - bind PostgreSQL queries from objects\n\nThis extremely small, zero-dependency tool helps you create PostgreSQL queries easier by using objects and automated objects to values bindings. Forget the dollar sign `$1` - use pg-bind.\n\n**Jump to**:\n\n- [API](#api)\n- [Docs](#docs)\n- [Tests](#tests)\n\n## Quick start\n\nInstall dependency:\n```bash\nnpm install --save pg-bind\n```\n\nRequire library in your code:\n```JavaScript\nconst bind  = require('pg-bind');\nconst query = bind('SELECT * FROM table WHERE age = :age', {age: 1});\n```\n\n## Features:\n\n### Bind queries\n\nWith `pg-bind` you can do that:\n\n```JavaScript\nconst bind  = require('pg-bind');\nconst obj   = {a: 1, b: 2, c: 3};\nconst query = bind('SELECT :a, :b, :c', obj); // Result is gonna be the same\n\n// Query: {text: 'SELECT $1, $2, $3', values: [1, 2, 3]}\n```\n\nAnd if query gets even more complicated (and it usually is):\n\n```JavaScript\n// How would you count binding here? Aha!\nconst bind  = require('pg-bind');\nconst query = `\n    WITH prepared_statement AS (\n        SELECT :blah, col1\n        FROM some_table\n        WHERE col2 = :kek\n    )\n    SELECT :colOne\n    FROM prepared_statement\n`;\n\nconst prepared = bind(query, {\n    blah: 'blah',\n    kek: 'lol',\n    colOne: 'one'\n});\n```\n\nAs you can see binding of queries is easy and queries themselves are more readable than with $ (dollar sign) bindings.\n\n### Bind multiple insert queries\n\nIf you ever wanted to insert multiple rows with one INSERT statement and concatenated strings (or joined an array of strings) for that - I'm deeply sorry.\n\nWith `pg-bind` you can do `bind.insert(query, arrayOfObjects)`:\n\n```JavaScript\n\n// We've got an insert list somewhere\nconst employees = [\n    {name: 'lol', age: 228,  role: 'loler'},\n    {name: 'kek', age: 1488, role: 'keker'}\n];\n\nconst insertQuery = bind.insert(`\n    INSERT INTO some_table (group_id, name, age, role, whatever)\n    VALUES (1, :name, :age, :role, 'whatever')\n`, employees);\n\n// insertQuery will be:\n// {\n//  text: `\n//      INSERT INTO some_table (group_id, name, age, role, whatever)\n//      VALUES (1, $1, $2, $3, 'whatever'),\n//        (1, $4, $5, $6, 'whatever')`,\n//  values: ['lol', 228, 'loler', 'kek', 1488, 'keker']\n// }\n```\n\nIs it hard? Nope. Is it hard to do it on your own? Probably.\n\n---\n\n\u003ca name=\"api\"\u003e\u003c/a\u003e\n\n## API\n\n**bind(query: String, values: Object)** -\u003e *{text: String, values: Array}*\n\nCreate query object supported by [node-postgres](https://github.com/brianc/node-postgres) with text and values properties.\n\n- All the binding parameters must be prefixed with ':' sign (i.e. `:param`).\n- Bound params\n- If param is not found/present in object - `null` is put instead.\n- If object is not passed (or is [falsy](https://developer.mozilla.org/en-US/docs/Glossary/Falsy)) into `bind()`, an Error is thrown.\n\n**Examples**:\n\n```JavaScript\nconst bind = require('pg-bind');\n\nbind(`SELECT * FROM table WHERE col = :colVal`, {colVal: 'sammy'}]);\n// Result: {\n// text: `SELECT * FROM table WHERE col = $1`\n// values: ['sammy']\n// }\n\nbind('UPDATE TABLE somethings SET thing = :thing WHERE some = :some', {some: 'kek', thing: 'lol'});\n// Result: {\n// text: 'UPDATE TABLE somethings SET thing = $1 WHERE some = $2',\n// values: ['lol', 'kek']\n// }\n```\n\n\n**bind.insert(query: String, values: Object[])** -\u003e *{text: String, values: Array}*\n\n*Alias: bind.bindInsert*\n\nCreate multiple/single insert query from pattern.\n\n- Query MUST have `VALUES (...)` block, as it is used to create statements.\n- All binding parameters MUST be prefixed with ':' sign. However, as you can see in example above you can put any value into VALUES statement and it will be saved in each insert block\n- If `values` is not an Array but an Object -\u003e `bind()` is used. So it's pretty safe on single inserts.\n\n\n**Examples**:\n\n```JavaScript\nconst bind = require('pg-bind');\n\nbind.insert(`INSERT INTO user_roles (user_id, role) VALUES (:userId, 'default')`, [{userId: 1}, {userId: 2}]);\n// Result: {\n// text: `INSERT INTO user_roles (user_id, role) VALUES ($1, 'default'), ($2, 'default')`\n// values: [1, 2]\n// }\n```\n\n---\n\n\u003ca name=\"docs\"\u003e\u003c/a\u003e\n\n## Documentation\n\nTo generate documentation (and open it) run:\n\n```bash\nnpm run docs                          # just generate docs\nnpm run docs \u0026\u0026 open docs/index.html  # generate and open docs in default application for HTML ext\n```\n\n\u003ca name=\"tests\"\u003e\u003c/a\u003e\n\n## Coverage\n\nTo generate coverage report (and open it) run:\n\n```bash\nnpm run coverage                              # generate report\nnpm run coverare \u0026\u0026 open coverage/index.html  # generate and open in default application for HTML ext\n```\n\n## Tests\n\nTo run tests type:\n\n```bash\nnpm test\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdamirka%2Fpg-bind","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdamirka%2Fpg-bind","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdamirka%2Fpg-bind/lists"}