{"id":32119041,"url":"https://github.com/dsego/sql_tag","last_synced_at":"2026-02-19T02:02:01.314Z","repository":{"id":62422483,"uuid":"449685087","full_name":"dsego/sql_tag","owner":"dsego","description":"JS tagged template literals for prepared SQL statements.","archived":false,"fork":false,"pushed_at":"2025-07-07T14:04:58.000Z","size":111,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-20T17:56:43.493Z","etag":null,"topics":["database","deno-module","query-builder","safe-sql","sql","template-literals"],"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/dsego.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-01-19T12:36:52.000Z","updated_at":"2025-07-24T21:24:57.000Z","dependencies_parsed_at":"2025-04-21T10:41:41.484Z","dependency_job_id":null,"html_url":"https://github.com/dsego/sql_tag","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/dsego/sql_tag","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dsego%2Fsql_tag","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dsego%2Fsql_tag/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dsego%2Fsql_tag/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dsego%2Fsql_tag/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dsego","download_url":"https://codeload.github.com/dsego/sql_tag/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dsego%2Fsql_tag/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29600844,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T00:59:38.239Z","status":"online","status_checked_at":"2026-02-19T02:00:07.702Z","response_time":117,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["database","deno-module","query-builder","safe-sql","sql","template-literals"],"created_at":"2025-10-20T17:56:29.378Z","updated_at":"2026-02-19T02:02:01.301Z","avatar_url":"https://github.com/dsego.png","language":"JavaScript","readme":"\u003cimg width=\"200px\" style src=\"https://github.com/dsego/sql_tag/raw/main/media/sql_tag.svg\" /\u003e\n\n## `sql` tag\n\nJS tagged template literals for prepared SQL statements.\n\n```js\nconst q = sql`SELECT * FROM table WHERE foo = ${foo} AND bar = ${bar}`;\n// =\u003e {\n//      query: 'SELECT * FROM table WHERE foo = ? AND bar = ?',\n//      params: [foo, bar]\n//    }\n```\n\nUse numbered placeholders:\n\n```js\nimport { pgsql as sql } from \"https://deno.land/x/sql_tag/mod.js\";\nconst q = sql`SELECT * FROM table WHERE foo = ${foo} AND bar = ${bar}`;\n// =\u003e {\n//      query: 'SELECT * FROM table WHERE foo = $1 AND bar = $2',\n//      params: [foo, bar]\n//    }\n```\n\nAlso supports arrays:\n\n```js\nsql`SELECT * FROM table WHERE foo IN ${[1, 2, 3]}`;\n// =\u003e {\n//      query: 'SELECT * FROM table WHERE foo IN (?, ?, ?)',\n//      params: [1, 2, 3]\n//    }\n```\n\n#### Interpolating raw values with `sql.raw`\n\n\u003e Raw values are not sanitized or escaped in any way!!!\n\n```js\nconst q = sql`SELECT ${sql.raw(1)}`;\n// =\u003e SELECT 1\n```\n\n#### Escaping identifiers with `sql.identifier`\n\nSQL identifiers are not parameterized. They can be escaped via `sql.identifier`:\n\n```js\nconst table = \"schema.table\";\nconst q = sql`SELECT * FROM ${sql.identifier(table)}`;\n// =\u003e SELECT * FROM \"schema\".\"table\"\n\nconst q = mysql`SELECT * FROM ${sql.identifier(table)}`;\n// =\u003e SELECT * FROM `schema`.`table`\n```\n\n#### Statements can be nested\n\nUseful for building dynamic queries.\n\n```js\nconst q = sql`SELECT * FROM student WHERE score \u003e (${sql\n  `SELECT avg(score) FROM student WHERE subject = ${subject}`})`;\n\n// =\u003e {\n//      query: 'SELECT * FROM student WHERE grade \u003e (\n//        SELECT avg(grade) FROM student WHERE subject = ?\n//      )',\n//      params: [subject]\n//    }\n```\n\n#### Append statements\n\nBuild complex queries depending on conditionals.\n\n```js\nconst query = sql`SELECT * FROM table`;\nif (foo) {\n  query.append(sql`WHERE foo = ${foo}`);\n}\n\n// =\u003e { query: 'SELECT * FROM table WHERE foo = ?', params: [foo]}\n```\n\n#### Join statements with `sql.join(statements, glue)`\n\nJoin a list of sql statements with a glue string.\n\n```js\nconst query = sql`UPDATE table SET ${\n  sql.join([\n    sql`col1 = ${foo}`,\n    sql`col2 = ${bar}`,\n  ], \", \")\n} WHERE id = ${id}`;\n// =\u003e {\n//      query: 'UPDATE table SET col1 = ?, col2 = ? WHERE id = ?',\n//      params: [foo, bar, id]\n//    }\n\nconst query = sql`SELECT * FROM table WHERE ${\n  sql.join([\n    sql`col1 = ${foo}`,\n    sql`col2 = ${bar}`,\n    sql`col3 = ${baz}`,\n  ], \" AND \")\n}`;\n// =\u003e {\n//      query: 'SELECT * FROM table WHERE col1 = ? AND col2 = ? AND col3 = ?',\n//      params: [foo, bar, baz]\n//    }\n```\n\n#### Join statements with shortcuts\n\nJoin a list of sql statements with `sql.and`, `sql.or`, `sql.comma`. The AND/OR\nstatements are also wrapped in parentheses for easy nesting.\n\n```js\nconst query = sql`UPDATE table SET\n  ${sql.comma(sql`col1 = ${foo}`, sql`col2 = ${bar}`)}\n  WHERE id = ${id}`;\n// =\u003e {\n//      query: 'UPDATE table SET col1 = ?, col2 = ? WHERE id = ?',\n//      params: [foo, bar, id]\n//    }\n\nconst query = sql`SELECT * FROM table WHERE ${\n  sql.and(\n    sql`col1 = ${foo}`,\n    sql`col2 = ${bar}`,\n    sql`col3 = ${baz}`,\n  )\n}`;\n// =\u003e {\n//      query: 'SELECT * FROM table WHERE (col1 = ? AND col2 = ? AND col3 = ?)',\n//      params: [foo, bar, baz]\n//    }\n```\n\n### Tests\n\n##### Unit tests\n\n`deno test tests/unit.test.js`.\n\n##### Integrations tests\n\n- Require `docker-compose up` to start the database server instances for mysql\n  and postgres.\n- Then run with:\n  `deno test tests/integration.test.js --unstable --allow-read --allow-env --allow-net --allow-write --no-check`\n\n### Inspired by\n\n- [Slonik](https://github.com/gajus/slonik#slonik-sql-tag)\n- [SQL Template Strings](https://github.com/felixfbecker/node-sql-template-strings)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdsego%2Fsql_tag","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdsego%2Fsql_tag","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdsego%2Fsql_tag/lists"}