{"id":26084196,"url":"https://github.com/mk3008/sqmodel","last_synced_at":"2025-10-18T05:03:37.577Z","repository":{"id":38523257,"uuid":"494679482","full_name":"mk3008/SqModel","owner":"mk3008","description":"A lightweight library for parsing and building select queries. SQL can be rebuilt dynamically.","archived":false,"fork":false,"pushed_at":"2023-02-28T13:10:09.000Z","size":660,"stargazers_count":17,"open_issues_count":5,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-16T17:47:08.371Z","etag":null,"topics":["sql","sqlbuilder","sqlparser","sqlrebuilder"],"latest_commit_sha":null,"homepage":"","language":"C#","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/mk3008.png","metadata":{"files":{"readme":"README-jp.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-05-21T04:27:33.000Z","updated_at":"2025-01-24T22:14:24.000Z","dependencies_parsed_at":"2025-04-12T00:43:51.120Z","dependency_job_id":"10e85d0f-e14e-4da6-91d4-5fea2f6a173c","html_url":"https://github.com/mk3008/SqModel","commit_stats":null,"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/mk3008/SqModel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mk3008%2FSqModel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mk3008%2FSqModel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mk3008%2FSqModel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mk3008%2FSqModel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mk3008","download_url":"https://codeload.github.com/mk3008/SqModel/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mk3008%2FSqModel/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263594556,"owners_count":23485871,"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","sqlbuilder","sqlparser","sqlrebuilder"],"created_at":"2025-03-09T04:50:57.444Z","updated_at":"2025-10-18T05:03:37.510Z","avatar_url":"https://github.com/mk3008.png","language":"C#","readme":"# SqModel\nSelectクエリを簡易に組み上げることができる軽量ライブラリです。\n\n## デモ\n```cs\nvar q = new SelectQuery();\nvar table_a = q.From(\"table_a\");\nq.Select(table_a, \"*\");\nq.Where(table_a, \"id\", \":id\", 1);\n\nvar acutal = q.ToQuery();\nvar expect = @\"select table_a.*\nfrom table_a\nwhere\n    table_a.id = :id\";\n\nAssert.Equal(expect, acutal.CommandText);\nAssert.Single(acutal.Parameters);\nAssert.Equal(1, acutal.Parameters[\":id\"]);\n````\n\n## 特徴\n- SQL構文に寄せたメソッド名（From、Select、Join、Where etc）。\n- テーブル別名、列別名に対応。\n- パラメータクエリに対応。\n- サブクエリに対応。\n- DISTINCTキーワードに対応。\n- CTE（Common Table Expression）に対応。\n- テーブル作成クエリに対応。\n- ビュー作成クエリに対応。\n- 控えめなSQL整形。\n\n## 制約\nSQL構文チェック機能はありません。\n\n## 実行環境\n.NET6\n\nhttps://www.nuget.org/packages/SqModel/\n\n## サンプル\n### 単一テーブル選択\n```cs\n    [Fact]\n    public void TableNameAlias()\n    {\n        var q = new SelectQuery();\n        var table_a = q.From(\"table_a\", \"a\");\n        q.Select(table_a, \"*\");\n\n        var text = q.ToQuery().CommandText;\n        var expect = @\"select a.*\nfrom table_a as a\";\n\n        Assert.Equal(expect, text);\n    }\n````\n\n### 列の取得\n```cs\n    [Fact]\n    public void SelectColumnWithAlias()\n    {\n        var q = new SelectQuery();\n        var table_a = q.From(\"table_a\", \"a\");\n        q.Select(table_a, \"column_x\", \"x\");\n\n        var text = q.ToQuery().CommandText;\n        var expect = @\"select a.column_x as x\nfrom table_a as a\";\n\n        Assert.Equal(expect, text);\n    }\n```\n\n### 変数を使用したパラメータクエリ\n\n```cs\n    [Fact]\n    public void SelectVariable()\n    {\n        var q = new SelectQuery();\n        var table_a = q.From(\"table_a\", \"a\");\n        q.Select(\":val\", \"value\").AddParameter(\":val\", 1);\n\n        var actual = q.ToQuery();\n        var text = actual.CommandText;\n        var expect = @\"select :val as value\nfrom table_a as a\";\n\n        Assert.Equal(expect, text);\n        Assert.Equal(1, actual.Parameters[\":val\"]);\n    }\n```\n\n### 結合\n```cs\n    [Fact]\n    public void JoinConditions()\n    {\n        var q = new SelectQuery();\n        var table_a = q.From(\"table_a\", \"a\");\n        var table_b = table_a.InnerJoin(\"table_b\", \"b\", new() { \"table_a_id\", \"table_a_sub_id\" });\n\n        q.Select(table_a, \"value_a\");\n        q.Select(table_b, \"value_b\");\n\n        var text = q.ToQuery().CommandText;\n        var expect = @\"select a.value_a, b.value_b\nfrom table_a as a\ninner join table_b as b on a.table_a_id = b.table_a_id and a.table_a_sub_id = b.table_a_sub_id\";\n\n        Assert.Equal(expect, text);\n    }\n```\n\n### サブクエリ\n```cs\n    [Fact]\n    public void Valiable()\n    {\n        var q = new SelectQuery();\n        var a = q.From(sq =\u003e\n        {\n            var t = sq.From(\"table_a\");\n            sq.Select(t, \"*\");\n            sq.Select(\":val1\", \"val1\").AddParameter(\":val1\", 1);\n        }\n        , \"a\");\n\n        var b = a.InnerJoin(sq =\u003e\n        {\n            var t = sq.From(\"table_b\");\n            sq.Select(t, \"*\");\n            sq.Select(\":val2\", \"val2\").AddParameter(\":val2\", 2);\n        }, \"b\", new() { \"table_a_id\" });\n\n        q.Select(a, \"*\");\n        q.Select(b, \"*\");\n\n        var actual = q.ToQuery();\n        var text = actual.CommandText;\n        var expect = @\"select a.*, b.*\nfrom (\n    select table_a.*, :val1 as val1\n    from table_a\n) as a\ninner join (\n    select table_b.*, :val2 as val2\n    from table_b\n) as b on a.table_a_id = b.table_a_id\";\n\n        Assert.Equal(expect, text);\n        Assert.Equal(1, actual.Parameters[\":val1\"]);\n        Assert.Equal(2, actual.Parameters[\":val2\"]);\n    }\n```\n\n### 抽出条件\n```cs\n    [Fact]\n    public void Default()\n    {\n        var q = new SelectQuery();\n        var table_a = q.From(\"table_a\");\n        q.Select(table_a, \"*\");\n        q.Where(table_a, \"id\", \":id\", 1);\n\n        var acutal = q.ToQuery();\n        var expect = @\"select table_a.*\nfrom table_a\nwhere\n    table_a.id = :id\";\n\n        Assert.Equal(expect, acutal.CommandText);\n        Assert.Single(acutal.Parameters);\n        Assert.Equal(1, acutal.Parameters[\":id\"]);\n    }\n```\n\n### 抽出条件（グループ）\n```cs\n    [Fact]\n    public void OperatorOr()\n    {\n        var q = new SelectQuery();\n        var table_a = q.From(\"table_a\");\n        q.Select(table_a, \"*\");\n        q.Where(g =\u003e\n        {\n            g.Where(\"table_a.id = :id1\").AddParameter(\":id1\", 1);\n            g.Where(\"table_a.id = :id2\").AddParameter(\":id2\", 2);\n        });\n\n        var acutal = q.ToQuery();\n        var expect = @\"select table_a.*\nfrom table_a\nwhere\n    (table_a.id = :id1 or table_a.id = :id2)\";\n\n        Assert.Equal(expect, acutal.CommandText);\n        Assert.Equal(2, acutal.Parameters.Count);\n        Assert.Equal(1, acutal.Parameters[\":id1\"]);\n        Assert.Equal(2, acutal.Parameters[\":id2\"]);\n    }\n```\n\n### 抽出条件だけを使う\n```cs\n    [Fact]\n    public void WhereOnly()\n    {\n        var q = new SelectQuery();\n        q.Where(g =\u003e\n        {\n            g.Where(\"table_a.id = :id1\").AddParameter(\":id1\", 1);\n            g.Where(\"table_a.id = :id2\").AddParameter(\":id2\", 2);\n        });\n        q.Where(\"table_a.sub_id = :sub_id\").AddParameter(\":sub_id\", 2);\n\n        var acutal = q.WhereClause.ToQuery();\n        var expect = @\"where\n    (table_a.id = :id1 or table_a.id = :id2)\n    and table_a.sub_id = :sub_id\";\n\n        Assert.Equal(expect, acutal.CommandText);\n        Assert.Equal(3, acutal.Parameters.Count);\n        Assert.Equal(1, acutal.Parameters[\":id1\"]);\n        Assert.Equal(2, acutal.Parameters[\":id2\"]);\n        Assert.Equal(2, acutal.Parameters[\":sub_id\"]);\n    }\n```\n\n### CTE\n```cs\n    [Fact]\n    public void Default()\n    {\n        var q = new SelectQuery();\n        q.With(x =\u003e\n        {\n            var t = x.From(\"table_a\");\n            x.Select(t, \"*\");\n        }, \"a\");\n\n        var a = q.From(\"a\");\n        q.Select(a, \"*\");\n\n        var text = q.ToQuery().CommandText;\n        var expect = @\"with\na as (\n    select table_a.*\n    from table_a\n)\nselect a.*\nfrom a\";\n\n        Assert.Equal(expect, text);\n    }\n```\n\n### テーブル作成\n```cs\n    [Fact]\n    public void Default()\n    {\n        var q = new SelectQuery();\n        var table_a = q.From(\"table_a\");\n        q.Select(table_a, \"*\");\n\n        var tq = new CreateTableQuery() { SelectQuery = q, TableName = \"tmp\" };\n\n        var text = tq.ToQuery().CommandText;\n        var expect = @\"create table tmp\nas\nselect table_a.*\nfrom table_a\";\n\n        Assert.Equal(expect, text);\n    }\n```\n\n### ビュー作成\n```cs\n    [Fact]\n    public void Default()\n    {\n        var q = new SelectQuery();\n        var table_a = q.From(\"table_a\");\n        q.Select(table_a, \"*\");\n\n        var tq = new CreateViewQuery() { SelectQuery = q, ViewName = \"tmp\" };\n\n        var text = tq.ToQuery().CommandText;\n        var expect = @\"create view tmp\nas\nselect table_a.*\nfrom table_a\";\n\n        Assert.Equal(expect, text);\n    }\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmk3008%2Fsqmodel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmk3008%2Fsqmodel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmk3008%2Fsqmodel/lists"}