{"id":24738607,"url":"https://github.com/zweifisch/cadena","last_synced_at":"2026-05-07T13:06:07.642Z","repository":{"id":57192613,"uuid":"73812569","full_name":"zweifisch/cadena","owner":"zweifisch","description":"cadena helps you to write safer sql","archived":false,"fork":false,"pushed_at":"2018-09-03T11:15:34.000Z","size":52,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-28T18:45:52.895Z","etag":null,"topics":["sql"],"latest_commit_sha":null,"homepage":"","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/zweifisch.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2016-11-15T12:42:29.000Z","updated_at":"2019-08-25T06:11:26.000Z","dependencies_parsed_at":"2022-08-24T05:21:20.224Z","dependency_job_id":null,"html_url":"https://github.com/zweifisch/cadena","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zweifisch%2Fcadena","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zweifisch%2Fcadena/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zweifisch%2Fcadena/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zweifisch%2Fcadena/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zweifisch","download_url":"https://codeload.github.com/zweifisch/cadena/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245006598,"owners_count":20546136,"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":["sql"],"created_at":"2025-01-27T22:55:01.103Z","updated_at":"2025-10-05T10:16:33.768Z","avatar_url":"https://github.com/zweifisch.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cadena\n\n[![NPM Version][npm-image]][npm-url]\n[![Build Status][travis-image]][travis-url]\n[![Node.js Version][node-version-image]][node-version-url]\n\ncadena helps you to write safer SQL\n\n- supports parameterized query\n- `run()` returns promise\n- supports mysql, sqlite3 and rqlite\n\n## usage\n\n```sh\nnpm install --save cadena\n```\n\n```js\nconst { select, connect, query, sql } = require('cadena')\nconst db = connect('mysql', 'mysql://guest:guest@127.0.0.1/test')\n\nselect('name', 'id')\n    .from('players')\n    .where({score: { '\u003e=': 90 }})\n    .limit(0, 10)\n    .orderBy('score').desc().run(db)\n\n// just get SQL as string\nselect().from('players').toString()\n\nlet id = '33b27b80-bee3-4d1b-aa9a-231bf250f344'\nsql`select * from tbl where id=${id}`.run(db)\n\nsql`select * from tbl where id=${id}`.toString()\n// select * from tbl where id='33b27b80-bee3-4d1b-aa9a-231bf250f344'\n```\n\n### select\n\n```js\nselect(['name', 'id']) // SELECT name, id\n\nselect() // SELECT *\n```\n\n#### where\n\n```js\nwhere({key: 'value'}) // WHERE `key` = 'value'\n\nwhere({\n    score: {between: [80, 90]},\n    name: {contains: 'alberto'}\n    group: ['A', 'B']\n}) // WHERE `score` BETWEEN (80, 90) AND `name` LIKE '%alberto%' AND `group` IN ('A', 'B')\n\nwhere({key: {'\u003c': min}}).or({key: {'\u003e': max}}) // WHERE `key` \u003c min OR `key` \u003e max\n```\n\nundefined values are ignored\n\n```js\nwhere({key: undefined}) // not output\nwhere({key: undefined, key2: 'value'}) // WHERE `key2` = 'value'\nwhere({key: undefined}).or({key2: 'value'}) // WHERE `key2` = 'value'\n```\n\nnested and/or\n\n```js\nwhere(and(\n    or({ n: 1 }, { n: 2 }),\n    { k: 1 }))\n// WHERE (`n` = 1 OR `n` = 2) AND `k` = 1\n```\n\na more verbose form\n\n```js\nwhere({\n    $and: [\n        { $or: [{n: 1}, {n: 2}] },\n        { k: 1 }\n    ]\n})\n```\n\n#### orderBy\n\n```js\norderBy('field1', 'field2') // ORDER BY `field1`, `field2`\n\norderBy(['field1', 'field2']) // ORDER BY `field1`, `field2`\norderBy(['-field1', 'field2']) // ORDER BY `field1` DESC, `field2`\n\norderBy('field1', 'ASC', 'field2', 'DESC') // ORDER BY `field1` ASC, `field2` DESC\n\norderBy('field1').desc().orderBy('field2').asc() // ORDER BY `field1` DESC, `field2` ASC\n```\n\n#### join\n\n```js\nselect('name', 'id').from('tbl').leftJoin('tbl2').on({tbl.id: \"tbl2.tblId\"})\n```\n\n### subquery\n\n```js\nlet tbl = select('name', 'id').from('tbl')\nselect().from(tbl) // SELECT * FROM (SELECT `name`, `id` FROM `tbl`)\n```\n\n### count\n\n```js\nlet query = select().from('tbl').where({key: value}).orderBy('created_at').desc()\nquery.count().sql // SELECT COUNT(*) AS `total` FROM `tbl` WHERE `key` = 'value'\n```\n\n### insert\n\n```js\ninsert({name: 'foo', score: 1}).into('players')\ninsert(['name', 'score'], [['foo', 1], ['bar', 2]]).into('players')\n```\n\n### upsert\n\n```js\nupsert({name: 'foo', score: 1}).into('players')\n```\n\n### update\n\n```js\nupdate('players').set({name: 'foo', score: 1}).where({id: 1})\n```\n\n```js\nupdate('players').set('name', 'foo').set('score', 1).limit(1)\n```\n\n### delete\n\n```js\ndel('players').where({id: 1})\n```\n\n```js\ndel('players').where({name: {contains: 'alberto'}}).limit(1)\n```\n\n### parameterized query\n\n```js\nconst { sql } = require('cadena')\nlet name = 'first'\nlet id = 1\nsql`insert into tbl set name=${name} where id=${id}`.run(db)\n```\n\n### database intergration\n\nmysql\n\n```js\nconst db = cadena.connect('mysql', 'mysql://root:@127.0.0.1/test')\n```\n\nsqlite3\n\n```js\nconst db = cadena.connect('sqlite3', ':memory:')\n```\n\nrqlite\n\n```js\nconst db = cadena.connect('rqlite', 'http://127.0.0.1:4001')\n```\n\n[npm-image]: https://img.shields.io/npm/v/cadena.svg?style=flat\n[npm-url]: https://npmjs.org/package/cadena\n[travis-image]: https://img.shields.io/travis/zweifisch/cadena.svg?style=flat\n[travis-url]: https://travis-ci.org/zweifisch/cadena\n[node-version-image]: https://img.shields.io/node/v/cadena.svg\n[node-version-url]: https://nodejs.org/en/download/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzweifisch%2Fcadena","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzweifisch%2Fcadena","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzweifisch%2Fcadena/lists"}