{"id":25627616,"url":"https://github.com/jeppech/squel","last_synced_at":"2025-11-12T19:03:10.321Z","repository":{"id":57630657,"uuid":"408793374","full_name":"jeppech/squel","owner":"jeppech","description":"SQL statement writer","archived":false,"fork":false,"pushed_at":"2023-01-26T21:10:08.000Z","size":31,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-06-20T08:17:46.509Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","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/jeppech.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":"2021-09-21T11:29:40.000Z","updated_at":"2024-06-20T08:17:46.510Z","dependencies_parsed_at":"2023-02-15T00:17:00.314Z","dependency_job_id":null,"html_url":"https://github.com/jeppech/squel","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeppech%2Fsquel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeppech%2Fsquel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeppech%2Fsquel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeppech%2Fsquel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jeppech","download_url":"https://codeload.github.com/jeppech/squel/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240214592,"owners_count":19766264,"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":[],"created_at":"2025-02-22T17:53:34.688Z","updated_at":"2025-11-12T19:03:05.279Z","avatar_url":"https://github.com/jeppech.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# squel\nThis library will provide a structured way of writing SQL statements. Which works well in combination with the github.com/jmoiron/sqlx package.\n\n## SELECT statement\nUsing the `sqlx` package\n```golang\npackage main\nimport (\n    \"github.com/jeppech/squel\"\n    \"github.com/jmoiron/sqlx\"\n\t// pgsql driver\n    _ \"github.com/jackc/pgx/v4/stdlib\"\n)\n\nvar db *sqlx.DB\n\nstruct sqlData {\n    username string\n    avatar string\n    email string\n    name string\n}\n\nfunc main() {\n    var err error\n\n\tdb, err = sqlx.Connect(\"pgx\", \"\")\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n    username := \"jeppech\"\n\n    stmt := squel.Table(\"api.users usr\")\n    stmt.LeftJoin(\"api.tickets tck\", \"tck.user_id = usr.id\")\n    stmt.Where(\"usr.username = %s\", username)\n    stmt.And(\"usr.role = %s\", \"admin\")\n    query_string, query_args := stmt.Select(\"usr.username, usr.avatar, usr.email, tck.name\")\n    /**\n    query_string:\n        SELECT usr.username, usr.avatar, usr.email, tck.name\n        FROM api.users usr\n        LEFT JOIN api.tickets tck ON tck.user_id = usr.id\n        WHERE usr.username = $1\n        AND usr.role = $2\n\n    query_args:\n        [jeppech admin]\n    */\n\n    if err := stmt.Ok(); err != nil {\n        panic(err)\n    }\n\n    data := make([]*sqlData, 0)\n\n    err = db.Select(\u0026data, query_string, query_args...)\n    \n    if err != nil {\n        panic(err)\n    }\n\n    fmt.Printf(\"%+v\", data)\n}\n```\n\n## Insert statement\n```golang\nstmt := squel.Table(\"api.users\")\nstmt.Field(\"username\", \"jeppech\")\nstmt.Field(\"role\", \"admin\")\n// NilField are usefull, if the value could be nil.\n// i.e if the value originates from an API request, that could have NULL properties\nstmt.NilField(\"firstname\", \"Jeppe\")\nstmt.NilField(\"lastname\", \"Christiansen\")\nquery_string, query_args := stmt.Insert()\n\n/**\nquery_string:\n    INSERT INTO api.users (username,role,firstname,lastname)\n    VALUES ($1,$2,$3,$4)\n\nquery_args:\n    [jeppech admin Jeppe Christiansen]\n*/\n```\n\n## Update statement\n```golang\nstmt := squel.Table(\"api.users\")\nstmt.Field(\"email\", \"hello@example.com\")\nstmt.Field(\"role\", \"peasant\")\nstmt.Where(\"username = %s\", \"jeppech\")\nquery_string, query_args := stmt.Update()\n\n/**\nquery_string:\n    UPDATE api.users SET email = $1, role = $2\n    WHERE username = $3\n\nquery_args:\n    [hello@example.com peasant jeppech]\n*/\n```\n\n## Group clause\n```golang\nstmt := Table(\"api.users\")\nstmt.WhereGroup(func(s *Statement) {\n    s.Or(\"username = %s\", \"jeppech\")\n    s.Or(\"email = %s\", \"hello@example.com\")\n})\nstmt.And(\"pswd = %s\", \"VerySekritPassw0rt\")\nquery_string, query_args := stmt.Select(\"id\")\n\n/**\nquery_string:\n    SELECT id FROM api.users\n    WHERE (\n        username = $1 OR\n        email = $2\n    ) AND pswd = $3\n\nquery_args:\n    [jeppech hello@example.com VerySekritPassw0rt]\n*/\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeppech%2Fsquel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjeppech%2Fsquel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeppech%2Fsquel/lists"}