{"id":20459738,"url":"https://github.com/rosbit/dbx","last_synced_at":"2026-01-05T00:04:31.851Z","repository":{"id":57573035,"uuid":"343656238","full_name":"rosbit/dbx","owner":"rosbit","description":"golang database utility with easy-to-use transaction support. 基于ORM，更方便使用；事务处理流程自定义，代码不杂乱，易于使用","archived":false,"fork":false,"pushed_at":"2024-05-25T12:09:53.000Z","size":60,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-25T22:35:26.534Z","etag":null,"topics":["database","easy-to-use","orm","tranastion"],"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/rosbit.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":"2021-03-02T05:27:22.000Z","updated_at":"2024-05-25T12:09:35.000Z","dependencies_parsed_at":"2024-04-19T00:33:43.079Z","dependency_job_id":"6e332f62-3157-4fe1-a6df-6f72b25366f5","html_url":"https://github.com/rosbit/dbx","commit_stats":null,"previous_names":[],"tags_count":38,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosbit%2Fdbx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosbit%2Fdbx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosbit%2Fdbx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosbit%2Fdbx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rosbit","download_url":"https://codeload.github.com/rosbit/dbx/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244722747,"owners_count":20499153,"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","easy-to-use","orm","tranastion"],"created_at":"2024-11-15T12:17:08.222Z","updated_at":"2026-01-05T00:04:31.802Z","avatar_url":"https://github.com/rosbit.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dbx\n\n an ORM utitlity to handle database.\n\n## Usage\n\n- Import pacakge\n  \n  ```go\n  import \"github.com/rosbit/dbx\"\n  ```\n\n- Create db instance\n  \n  ```go\n  dataSourceName := dbx.GenerateMysqlDSN(dbx.DBName(\"test\"), dbx.Attr(\"charset\", \"utf8mb4\"))\n  dataSourceName := dbx.GenerateMysqlDSN(dbx.Host(\"127.0.0.1\"), dbx.User(\"root\"), dbx.DBName(\"test\"))\n  dataSourceName := dbx.GenerateMysqlDSN(dbx.Host(\"127.0.0.1\", 3306), dbx.User(\"root\", \"\"))\n  dataSourceName := dbx.GenerateMysqlDSN(dbx.DomainSocket(\"/tmp/mysql.sock\"))\n  \n  err := dbx.CreateMysqlConnection(dataSourceName, debug)\n  db, err := dbx.CreateMysqlInstance(dataSourceName, debug)\n  db, err := dbx.CreateDBDriverConnection(\"mysql\", dataSourceName, debug)\n  ```\n\n- Statements\n  \n  ```go\n  type User struct {\n      Id int\n      Name string\n      Age int\n  }\n  \n  var user User\n  var users []User\n  \n  // statement\n  //  Query\n  has, err := db.XStmt(\"user\").Where(dbx.Eq(\"name\", \"rosbit\")).Get(\u0026user)\n  err := db.XStmt(\"user\").Or(dbx.Eq(\"name\", \"rosbit\"), dbx.Eq(\"age\", 1)).Desc(\"name\").Get(\u0026user)\n  err := db.XStmt(\"user\").Or(dbx.Eq(\"name\", \"rosbit\"), dbx.Eq(\"age\", 1)).Limit(2).List(\u0026users)\n  \n  //  iterate\n  for uu := range db.XStmt(\"user\").Or(dbx.Eq(\"name\", \"rosbit\"), dbx.Eq(\"age\", 1)).Iter(\u0026user) {\n      u := uu.(*User)\n      // do something with u\n  }\n  \n  //  insert/update/delete\n  err := db.XStmt(\"user\").Insert(\u0026user)\n  affected, err := db.XStmt(\"user\").Where(dbx.Eq(\"id\", user.Id)).Cols(\"name\", \"age\").Update(\u0026user)\n  err := db.XStmt(\"user\").Where(dbx.Eq(\"id\", user.Id)).Delete(\u0026user)\n  \n  count, err := db.XStmt(\"user\").Where(dbx.Eq(\"name\", \"rosbit\")).Count(\u0026user)\n  sum, err := db.XStmt(\"user\").Where(dbx.Eq(\"name\", \"rosbit\")).Sum(\u0026user, \"age\")\n  ```\n\n- Join\n  \n  ```go\n  type User struct {\n      Id int\n      Name string\n      Age int\n  }\n  type Tag struct {\n      Id int\n      Name string\n  }\n  type UserTag struct {\n      Id int\n      UserId int\n      TagId int\n  }\n  \n  type UserWithTags struct {\n      User `xorm:\"extends\"`\n      UserTag `xorm:\"extends\"`\n      Tag `xorm:\"extends\"`\n  }\n  \n  var userWithTags []UserWithTags\n  err := dbx.XStmt().InnerJoin(\"user\", \"userTag\", \"user.id=userTag.user_id\").\n                     NextInnerJoin(\"tag\", \"userTag.tag_id=tag.id\").\n             Where(dbx.Eq(\"user.id\", 1)).\n             List(\u0026userWithTags)\n  ```\n\n- Transaction\n  \n  ```go\n  type Balance struct {\n     UserId int\n     Balance int\n  }\n  \n  const (\n     // args name\n     arg_balance = \"balance\"\n     arg_user_id = \"user_id\"\n  )\n  \n  func IncUserBalance(db *dbx.DBI, userId int, balance int) error {\n    // call Tx to run a transaction. Commit if no error ocurrs, otherwise it will rollback. \n    return db.Tx(\n       dbx.TxStmts(\n           find_user,\n           inc_balance,\n       ),\n       dbx.TxArg(arg_balance, balance),\n       dbx.TxArg(arg_user_id, userId),\n    )\n  }\n  \n  // --- stmt handler ---\n  func find_user(stmt *dbx.TxStmt) (error) {\n     userId := stmt.Arg(arg_user_id).(int)\n     var user User\n     has, err := stmt.Table(\"user\").Where(dbx.Eq(\"id\", userId)).Get(\u0026user)\n     if err != nil {\n        return err\n     }\n     if !has {\n        return fmt.Errorf(\"user not found\")\n     }\n     return nil\n  }\n  \n  func inc_balance(stmt *dbx.TxStmt) (error) {\n     userId := stmt.Arg(arg_user_id).(int)\n     incBalance := stmt.Arg(arg_balance).(int)\n     var balance Balance\n     has, err := stmt.Table(\"balance\").Where(dbx.Eq(\"user_id\", userId)).Get(\u0026balance)\n     if err != nil {\n        return err\n     }\n     if !has {\n         // insert a new one\n         balance.UserId = userId\n         balance.Balance = incBalance\n  \n         return stmt.Table(\"balance\").Insert(\u0026balance)\n     }\n  \n     // increment balance, update it\n     balance.Balance += incBalance\n     _, err = stmt.Table(\"balance\").Where(dbx.Eq(\"user_id\", userId)).Cols(\"balance\").Update(\u0026balance)\n     return err\n  }\n  ```\n\n- Conditions\n  \n  ```go\n  // conditions can be grouped by dbx.Where() or XStmt::Where()\n  \n  // And\n  dbx.Eq(\"a\", 1)\n  dbx.Op(\"b\", \"\u003e\", 2))  // -\u003e where\n  \n  dbx.Where(dbx.Eq(\"a\", 1), dbx.Op(\"b\", \"\u003e\", 2))\n  dbx.Where(dbx.And(dbx.Eq(\"a\", 1), dbx.Op(\"b\", \"\u003e\", 2)))\n  \n  // Or\n  dbx.Or(\n     dbx.Eq(\"a\", 1),\n     dbx.Op(\"b\", \"\u003c\", 2),\n     dbx.Op(\"c\", \"\u003e=\", 3),\n  ) // -\u003e where\n  dbx.Where(\n     dbx.Or(\n        dbx.Eq(\"a\", 1),\n        dbx.Op(\"b\", \"\u003c\", 2),\n        dbx.Op(\"c\", \"\u003e=\", 3),\n     ),\n  )\n  \n  // NOT\n  //  NOT AND\n  dbx.Not(\n     dbx.Eq(\"a\", 1),\n     dbx.Op(\"b\", \"\u003e\", 2),\n  )\n  dbx.Not(\n     dbx.And(\n       dbx.Eq(\"a\", 1),\n       dbx.Op(\"b\", \"\u003e\", 2),\n     ),\n  ) // -\u003e where\n  dbx.Where(dbx.Not(dbx.Eq(\"a\", 1), dbx.Op(\"b\", \"\u003e\", 2)))\n  dbx.Where(dbx.Not(dbx.And(dbx.Eq(\"a\", 1), dbx.Op(\"b\", \"\u003e\", 2))))\n  // NOT OR\n  dbx.Not(\n     dbx.Or(\n       dbx.Eq(\"a\", 1),\n       dbx.Op(\"b\", \"\u003c\", 2),\n       dbx.Op(\"c\", \"\u003e=\", 3),\n     ),\n  ) // -\u003e where\n  dbx.Where(dbx.Not(dbx.Or(dbx.Eq(\"a\", 1), dbx.Op(\"b\", \"\u003c\", 2), dbx.Op(\"c\", \"\u003e=\", 3))))\n  \n  // IN\n  dbx.In(\"id\", 1, 3, 5)\n  dbx.In(\"id\", []int{1, 3, 5}) // -\u003e where\n  \n  dbx.Where(dbx.In(\"id\", 1, 3, 5))\n  dbx.Where(dbx.In(\"id\", []int{1, 3, 5}))\n  \n  // not IN\n  dbx.NotIn(\"id\", 1, 3, 5)\n  dbx.Not(dbx.In(\"id\", []int{1, 3, 5}))\n  dbx.NotIn(\"id\", 1, 3, 5)\n  dbx.Not(dbx.In(\"id\", []int{1, 3, 5})) // -\u003e where\n  \n  dbx.Where(dbx.NotIn(\"id\", 1, 3, 5))\n  dbx.Where(dbx.Not(dbx.In(\"id\", []int{1, 3, 5})))\n  dbx.Where(dbx.NotIn(\"id\", 1, 3, 5))\n  dbx.Where(dbx.Not(dbx.In(\"id\", []int{1, 3, 5})))\n  \n  // SQL\n  dbx.Where(dbx.Sql(\"select id,name from user\"))\n  ```\n\n## Status\n\nThe package is fully tested.\n\n## Contribution\n\nPull requests are welcome! Also, if you want to discuss something send a pull request with proposal and changes.\n\n__Convention:__ fork the repository and make changes on your fork in a feature branch.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frosbit%2Fdbx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frosbit%2Fdbx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frosbit%2Fdbx/lists"}