{"id":26628218,"url":"https://github.com/luanphandinh/go-dbs","last_synced_at":"2026-04-12T02:34:32.015Z","repository":{"id":57562689,"uuid":"205486952","full_name":"luanphandinh/go-dbs","owner":"luanphandinh","description":"install, migrate, query dbs","archived":false,"fork":false,"pushed_at":"2019-10-23T14:59:15.000Z","size":272,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-06-20T10:07:12.374Z","etag":null,"topics":["go","mysql","postgresql","query-builder","sqlite3","sqlserver"],"latest_commit_sha":null,"homepage":"","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/luanphandinh.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-08-31T02:58:56.000Z","updated_at":"2019-10-23T15:47:58.000Z","dependencies_parsed_at":"2022-09-17T14:10:41.621Z","dependency_job_id":null,"html_url":"https://github.com/luanphandinh/go-dbs","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/luanphandinh%2Fgo-dbs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luanphandinh%2Fgo-dbs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luanphandinh%2Fgo-dbs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luanphandinh%2Fgo-dbs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luanphandinh","download_url":"https://codeload.github.com/luanphandinh/go-dbs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245269181,"owners_count":20587732,"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":["go","mysql","postgresql","query-builder","sqlite3","sqlserver"],"created_at":"2025-03-24T12:28:28.552Z","updated_at":"2026-04-12T02:34:26.963Z","avatar_url":"https://github.com/luanphandinh.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# go-dbs [![Build Status](https://travis-ci.org/luanphandinh/go-dbs.svg?branch=master)](https://travis-ci.org/luanphandinh/go-dbs)\n```\nSchema install, query builder for databases(sqlite3, mysql, postgres, sqlserver).\n```\n## Contents\n* [Schema](#schema)\n    * [Set platform](#1-set-platform)\n    * [Define schema](#2-define-schema)\n    * [Install](#3-install)\n* [Query builder](#query-builder)\n    * [Select](#query-builder-select)\n    * [Join](#query-builder-join)\n    * [Where](#query-builder-where)\n    * [Group By](#query-builder-group-by)\n    * [Having](#query-builder-having)\n    * [Order By](#query-builder-order-by)\n    * [Offset](#query-builder-offset)\n    * [Limit](#query-builder-limit)\n* [Issues](#issues)\n* [TODO](#todo)\n\n\u003ca name=\"schema\"\u003e\u003c/a\u003e\n### Schema\n\u003ca name=\"1-set-platform\"\u003e\u003c/a\u003e\n#### 1. Set platform:\n```go\n    // supported platforms: \"sqlite3\", \"mysql\", \"postgres\", \"sqlserver\"\n    // db is your `*sql.DB`\n    dbs.SetPlatform(\"sqlite3\", db)\n\n```\n\u003ca name=\"2-define-schema\"\u003e\u003c/a\u003e\n#### 2. Define schema\n```go\n    schema := new(dbs.Schema).WithName(\"company\").WithComment(\"The Company Schema\")\n    \n    department := new(dbs.Table).WithName(\"department\").WithComment(\"Departments of company\")\n    department.AddColumns(\n        new(dbs.Column).WithName(\"id\").WithType(dbs.INT).IsNotNull().IsUnsigned().IsAutoIncrement(),\n        new(dbs.Column).WithName(\"name\").WithType(dbs.NVARCHAR).WithLength(20).IsNotNull(),\n        new(dbs.Column).WithName(\"revenue\").WithType(dbs.FLOAT).IsNotNull().IsUnsigned().WithDefault(\"1.01\"),\n        new(dbs.Column).WithName(\"position\").WithType(dbs.SMALLINT).IsNotNull().IsUnsigned().IsUnique(),\n    )\n    \n    department.AddPrimaryKey(\"id\", \"name\")\n    department.AddIndex(\"name\", \"position\")\n    department.AddIndex(\"id\", \"name\", \"position\")\n    \n    employee := new(dbs.Table).WithName(\"employee\")\n    employee.AddColumns(\n        new(dbs.Column).WithName(\"id\").WithType(dbs.INT).IsNotNull().IsUnsigned().IsAutoIncrement(),\n        new(dbs.Column).WithName(\"name\").WithType(dbs.NVARCHAR).WithLength(20).IsNotNull(),\n        new(dbs.Column).WithName(\"department_id\").WithType(dbs.INT).IsUnsigned(),\n        new(dbs.Column).WithName(\"valid\").WithType(dbs.SMALLINT).WithDefault(\"1\").WithComment(\"Indicate employee status\"),\n        new(dbs.Column).WithName(\"age\").WithType(dbs.SMALLINT).IsNotNull().IsUnsigned().AddCheck(\"age \u003e 20\"),\n    )\n    employee.AddPrimaryKey(\"id\")\n    employee.AddChecks(\"age \u003c 50\")\n    employee.AddForeignKey(\"department_id\", \"department(id)\")\n    \n    storage := new(dbs.Table).WithName(\"storage\").WithComment(\"Storage for fun\")\n    storage.AddColumns(new(dbs.Column).WithName(\"room\").WithType(dbs.NVARCHAR).WithLength(50))\n    storage.AddColumns(new(dbs.Column).WithName(\"description\").WithType(dbs.TEXT))\n    \n    schema.AddTables(\n        department,\n        employee,\n        storage,\n    )\n```\n\n\u003ca name=\"3-install\"\u003e\u003c/a\u003e\n#### 3. Install\n```go\n    dbs.Install(dbSchema)\n```\n\n* Since Database and Schema a mostly the same stuff in MySQL, we will just care about tables.\n* Schema name will be used by `postgres` and `sqlserver`.\n\n\u003ca name=\"query-builder\"\u003e\u003c/a\u003e\n### Query Builder\n\n\u003ca name=\"query-builder-select\"\u003e\u003c/a\u003e\n#### Select\n```go\nNewQueryBuilder().\n    Select(\"valid\", \"name\", \"age\").\n    From(\"employee\").\n    GetQuery()\n```\n\n\u003ca name=\"query-builder-join\"\u003e\u003c/a\u003e\n#### Join\n```go\nNewQueryBuilder().\n    Select(\"*\").\n    From(\"employee e\").Join(\"department d\").On(\"e.department_id = d.id\") // or LeftJoin | RightJoin\n    GetQuery()\n```\n\n\u003ca name=\"query-builder-where\"\u003e\u003c/a\u003e\n#### Where\n* Single where\n```go\nNewQueryBuilder().\n    Select(\"*\").\n    From(\"employee\").\n    Where(\"(id = %d)\", 1).\n    GetQuery()\n```\n\n* AndWhere | OrWhere\n```go\nNewQueryBuilder().\n    Select(\"name, age\").\n    From(\"employee\").\n    Where(\"id = %d\", 1).\n    AndWhere(\"name = '%s'\", \"Luan Phan\"). // OrWhere(\"name = '%s'\", \"Luan Phan\").\n    GetQuery()\n```\n\n* Mixed where query\n```go\nNewQueryBuilder().\n    From(\"employee\").\n    Where(\"(id = %d AND name = ?)\").\n    OrWhere(\"department_id = ?\").\n    GetQuery()\n```\n\n\u003ca name=\"query-builder-group-by\"\u003e\u003c/a\u003e\n#### Group By\n```go\nNewQueryBuilder().\n    Select(\"room, COUNT(room) as c_room\").\n    From(\"storage\").\n    GroupBy(\"room\").\n    GetQuery()\n```\n\n\u003ca name=\"query-builder-having\"\u003e\u003c/a\u003e\n#### Having\n```go\nNewQueryBuilder().\n    Select(\"room, COUNT(room) as c_room\").\n    From(\"storage\").\n    GroupBy(\"room\").\n    Having(\"COUNT(room) \u003e ?\").\n    GetQuery()\n```\n\n\u003ca name=\"query-builder-order-by\"\u003e\u003c/a\u003e\n#### Order By\n```go\nquery = NewQueryBuilder().\n    From(\"employee\").\n    Where(\"name = ?\").\n    OrderBy(\"id ASC, name\").\n    GetQuery()\n```\n\n\u003ca name=\"query-builder-offset\"\u003e\u003c/a\u003e\n#### Offset\nThis is not supported for mssql yet\n```go\nquery = NewQueryBuilder().\n    Select(\"*\").\n    From(\"employee\").\n    Offset(\"10\").\n    GetQuery()\n```\n\n\u003ca name=\"query-builder-limit\"\u003e\u003c/a\u003e\n#### Limit\nThis is not supported for mssql yet\n```go\nquery = NewQueryBuilder().\n    Select(\"*\").\n    From(\"employee\").\n    Limit(\"10\").\n    GetQuery()\n```\n\n\u003ca name=\"issues\"\u003e\u003c/a\u003e\n# ISSUES\n* Please refer your data types as your database platform\n* Currently `go-dbs` *doest not support* centralized data types across platforms\n* Any error or failure will resulted int `log.Fatal()` since the schema installation is important,\nso thing need to be failed as soon as possible \n* Really bad performance, need to tune up somehow when query related to params `BenchmarkQueryBuilderComplex`\n```bash\ngo test -cpu 1 -run none -bench . -benchtime 3s\ngoos: darwin\ngoarch: amd64\npkg: github.com/luanphandinh/go-dbs\nBenchmarkQueryBuilder           20000000               190 ns/op             384 B/op          2 allocs/op\nBenchmarkQueryBuilderComplex    10000000               684 ns/op             624 B/op          5 allocs/op\nBenchmarkRawQuery               5000000000               0.29 ns/op            0 B/op          0 allocs/op\nPASS\nok      github.com/luanphandinh/go-dbs  13.690s\n```\n\u003ca name=\"todo\"\u003e\u003c/a\u003e\n# TODO\n* Query Builder\n* Support Migrate Schema\n* Support check current database schema\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluanphandinh%2Fgo-dbs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluanphandinh%2Fgo-dbs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluanphandinh%2Fgo-dbs/lists"}