{"id":21526325,"url":"https://github.com/linxgnu/mssqlx","last_synced_at":"2025-04-09T13:06:56.398Z","repository":{"id":41811337,"uuid":"77356921","full_name":"linxGnu/mssqlx","owner":"linxGnu","description":"Database client library, proxy for any master slave, master master structures. Lightweight, performant and auto balancing in mind.","archived":false,"fork":false,"pushed_at":"2024-04-29T16:07:53.000Z","size":250,"stargazers_count":102,"open_issues_count":3,"forks_count":15,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-04-02T11:05:33.845Z","etag":null,"topics":["database","database-connection","go","golang","master-master","master-slave"],"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/linxGnu.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}},"created_at":"2016-12-26T04:05:09.000Z","updated_at":"2025-01-27T15:46:25.000Z","dependencies_parsed_at":"2022-08-29T11:20:54.516Z","dependency_job_id":"c607faf7-d1a1-4b45-b84b-26f201966d45","html_url":"https://github.com/linxGnu/mssqlx","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linxGnu%2Fmssqlx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linxGnu%2Fmssqlx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linxGnu%2Fmssqlx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linxGnu%2Fmssqlx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/linxGnu","download_url":"https://codeload.github.com/linxGnu/mssqlx/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248045231,"owners_count":21038553,"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":["database","database-connection","go","golang","master-master","master-slave"],"created_at":"2024-11-24T01:44:37.316Z","updated_at":"2025-04-09T13:06:56.383Z","avatar_url":"https://github.com/linxGnu.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mssqlx\n\n[![](https://github.com/linxGnu/mssqlx/workflows/CI/badge.svg)]()\n[![Go Report Card](https://goreportcard.com/badge/github.com/linxGnu/mssqlx)](https://goreportcard.com/report/github.com/linxGnu/mssqlx)\n[![Coverage Status](https://coveralls.io/repos/github/linxGnu/mssqlx/badge.svg?branch=master)](https://coveralls.io/github/linxGnu/mssqlx?branch=master)\n[![godoc](https://img.shields.io/badge/docs-GoDoc-green.svg)](https://godoc.org/github.com/linxGnu/mssqlx)\n\nEmbeddable, high availability, performance and lightweight database client library. Support go 1.9 or newer.\n\nFeatures and concepts are:\n\n* Builtin layer/extension to [sqlx](http://jmoiron.github.io/sqlx).\n* Auto proxy for any master-slave, master-master databases. Compatible with Wsrep, Galera Cluster and others.\n* Auto and lightweight round-robin balancer for queries.\n* Builtin error handling for Wsrep, Galera and some database drivers. Auto retry `select/get/query` queries when detected bad connection causing by DBMS's timeout policy which auto-closes non interactive/timeout connection.\n* Auto health checking.\n\nFor more detail of api, please refer to [godoc](https://godoc.org/github.com/linxGnu/mssqlx)\n\n## Install\n\n    go get -u github.com/linxGnu/mssqlx\n\n## Connecting to Databases\n\nmssqlx is compatible to all kind of databases which `database/sql` supports. Below code is `mysql` usage:\n\n```go\nimport (\n    _ \"github.com/go-sql-driver/mysql\"\n    \"github.com/linxGnu/mssqlx\"\n)\n\ndsn := \"root:123@(%s:3306)/test?charset=utf8\u0026collation=utf8_general_ci\u0026parseTime=true\"\nmasterDSNs := []string{\n    fmt.Sprintf(dsn, \"172.31.25.233\"), // address of master 1\n    fmt.Sprintf(dsn, \"172.31.24.233\"), // address of master 2 if have\n    fmt.Sprintf(dsn, \"172.31.23.233\"), // address of master 3 if have\n}\nslaveDSNs := []string{\n    fmt.Sprintf(dsn, \"172.31.25.234\"), // address of slave 1\n    fmt.Sprintf(dsn, \"172.31.25.235\"), // address of slave 2\n    fmt.Sprintf(dsn, \"172.31.25.236\"), // address of slave 3\n}\n\ndb, _ := mssqlx.ConnectMasterSlaves(\"mysql\", masterDSNs, slaveDSNs)\n```\n\n## Connecting to Galera Cluster\n\nRecommended to set flag as following: \n\n```go\ndb, _ := mssqlx.ConnectMasterSlaves(\"mysql\", masterDSNs, slaveDSNs, mssqlx.WithWsrep())\n```\n\n## Connecting to Databases with custom read-query source\n\nRead-queries will be distributed among both masters and slaves: \n\n```go\ndb, _ := mssqlx.ConnectMasterSlaves(\"mysql\", masterDSNs, slaveDSNs, mssqlx.WithReadQuerySource(mssqlx.ReadQuerySourceAll))\n```\n\n## Configuration\n\nIt's highly recommended to setup configuration before querying.\n\n```go\ndb.SetMaxIdleConns(20) // set max idle connections to all nodes\n// db.SetMasterMaxIdleConns(20) // set max idle connections to master nodes\n// db.SetSlaveMaxIdleConns(20) // set max idle connections to slave nodes\n\ndb.SetMaxOpenConns(50) // set max open connections to all nodes\n// db.SetMasterMaxOpenConns(50) \n// db.SetSlaveMaxOpenConns(50)\n    \n// if nodes fail, checking healthy in a period (in milliseconds) for auto reconnect. Default is 500.\ndb.SetHealthCheckPeriod(1000) \n// db.SetMasterHealthCheckPeriod(1000)\n// db.SetSlaveHealthCheckPeriod(1000)\n```\n\n## Select\n\n```go\ntype Person struct {\n    FirstName string `db:\"first_name\"`\n    LastName  string `db:\"last_name\"`\n    Email     string\n    Data      []byte\n}\n\nvar people []Person\ndb.Select(\u0026people, \"SELECT * FROM person WHERE id \u003e ? and id \u003c ? ORDER BY first_name ASC\", 1, 1000)\n```\n\n## Get\n\n```go\nvar person Person\ndb.Get(\u0026person, \"SELECT * FROM person WHERE id = ?\", 1)\n```\n\n## Queryx\n\n```go\n// Loop through rows using only one struct\nvar person Person\n\nrows, err := db.Queryx(\"SELECT * FROM person\") // or db.QueryxOnMaster(...)\nfor rows.Next() {\n    if err := rows.StructScan(\u0026person); err != nil {\n        log.Fatalln(err)\n    } \n    fmt.Printf(\"%#v\\n\", person)\n}\n```\n\n## Named query\n\n```go\n// Loop through rows using only one struct\nvar person Person\n\nrows, err := db.NamedQuery(`SELECT * FROM person WHERE first_name = :fn`, map[string]interface{}{\"fn\": \"Bin\"}) // or db.NamedQueryOnMaster(...)\nfor rows.Next() {\n    if err := rows.StructScan(\u0026person); err != nil {\n        log.Fatalln(err)\n    } \n    fmt.Printf(\"%#v\\n\", person)\n}\n```\n\n## Exec (insert/update/delete/etc...)\n\n```go\nresult, err := db.Exec(\"DELETE FROM person WHERE id \u003c ?\", 100)\n```\n\n## Transaction\n\n```go\n// Recommended write transaction this way\ntx, e := db.Begin()\nif e != nil {\n\treturn e\n}\n    \nshouldAutoRollBack := true\ndefer func() {\n\tif e := recover(); e != nil {\n\t\terr = fmt.Errorf(\"%v\", e)\n\t\ttx.Rollback()\n\t} else if err != nil \u0026\u0026 shouldAutoRollBack {\n\t\ttx.Rollback()\n\t}\n}()\n\t\t\t\nif _, err = tx.Exec(\"INSERT INTO person(first_name, last_name, email, data) VALUES (?,?,?,?)\", \"Jon\", \"Dow\", \"jon@gmail\", []byte{1, 2}); err != nil {\n        return\n}\n    \nif _, err = tx.Exec(\"INSERT INTO person(first_name, last_name, email, data) VALUES (?,?,?,?)\", \"Jon\", \"Snow\", \"snow@gmail\", []byte{1}); err != nil {\n    return\n}\n\t\t\t\nif err = tx.Commit(); err != nil {\n    shouldAutoRollBack = false\n}\n```\n\n## Notices\n\n* APIs supports executing query on master-only or slave-only (or boths). Function name for querying on master-only has suffix `OnMaster`, querying on slaves-only has suffix `OnSlave`.\n* Default `select/show queries` are balanced on slaves.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinxgnu%2Fmssqlx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flinxgnu%2Fmssqlx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinxgnu%2Fmssqlx/lists"}