{"id":22396437,"url":"https://github.com/spacebat/dyndb","last_synced_at":"2025-03-26T23:14:42.345Z","repository":{"id":225921950,"uuid":"767251259","full_name":"spacebat/dyndb","owner":"spacebat","description":"Per-database multi-tenancy experiment in Ash","archived":false,"fork":false,"pushed_at":"2024-03-06T07:47:21.000Z","size":15,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-01T04:43:55.289Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/spacebat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2024-03-05T00:38:26.000Z","updated_at":"2025-01-06T01:43:58.000Z","dependencies_parsed_at":"2024-03-05T02:03:34.405Z","dependency_job_id":null,"html_url":"https://github.com/spacebat/dyndb","commit_stats":null,"previous_names":["spacebat/dyndb"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spacebat%2Fdyndb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spacebat%2Fdyndb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spacebat%2Fdyndb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spacebat%2Fdyndb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spacebat","download_url":"https://codeload.github.com/spacebat/dyndb/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245749907,"owners_count":20666086,"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":"2024-12-05T06:08:11.372Z","updated_at":"2025-03-26T23:14:42.328Z","avatar_url":"https://github.com/spacebat.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dyndb\n\nExperiment in Ash multi-tenancy by switching between databases/connections.\n\n## Getting Started\n\n0. Postgresql listening on localhost:5432 with user postgres, pass postgres, failing that you'll need to edit `config/dev.exs`\n\n1. Clone the git repo to a directory, say dyndb:\n\n`git clone https://github.com/spacebat/dyndb.git`\n\n`cd dyndb`\n\n`mix deps.get`\n\n2. Ceate 2 databases in local postgres, \"tenant1\" and \"tenant2\"\n\n`mix dyndb.create_dbs`\n\n3. Run IEx and try to figure out how to do multi-tenancy\n\n`iex -S mix`\n\nIn the case below, the default tenant database named \"postgres\" is queried because the effects of `put_dynamic_repo` do not carry over to the process that performs the query. The default tenant does not have the \"compasses\" table.\n\n```\niex\u003e Compass.read!(\"tenant1\")\n\n01:22:38.335 [debug] Getting connection for tenant tenant1...\n\n01:22:38.339 [debug] Connection obtained tenant tenant1: #PID\u003c0.362.0\u003e\n\n01:22:38.340 [debug] Connection #PID\u003c0.362.0\u003e set on #PID\u003c0.361.0\u003e for tenant tenant1\n\n01:22:38.379 [debug] QUERY ERROR source=\"compasses\" db=0.7ms queue=3.0ms idle=912.7ms\nSELECT c0.\"id\", c0.\"name\" FROM \"compasses\" AS c0 []\n** (Ash.Error.Unknown) Unknown Error\n\n* ** (Postgrex.Error) ERROR 42P01 (undefined_table) relation \"compasses\" does not exist\n\n    query: SELECT c0.\"id\", c0.\"name\" FROM \"compasses\" AS c0\n  (ecto_sql 3.11.1) lib/ecto/adapters/sql.ex:1054: Ecto.Adapters.SQL.raise_sql_call_error/1\n  (ecto_sql 3.11.1) lib/ecto/adapters/sql.ex:952: Ecto.Adapters.SQL.execute/6\n  (ecto 3.11.1) lib/ecto/repo/queryable.ex:232: Ecto.Repo.Queryable.execute/4\n  (ecto 3.11.1) lib/ecto/repo/queryable.ex:19: Ecto.Repo.Queryable.all/3\n  (ash_postgres 1.5.15) lib/data_layer.ex:701: anonymous fn/3 in AshPostgres.DataLayer.run_query/2\n  (ash_postgres 1.5.15) lib/data_layer.ex:700: AshPostgres.DataLayer.run_query/2\n  (ash 2.19.14) lib/ash/actions/read/read.ex:2000: Ash.Actions.Read.run_query/4\n  (ash 2.19.14) lib/ash/actions/read/read.ex:390: anonymous fn/5 in Ash.Actions.Read.do_read/4\n    (elixir 1.16.1) lib/process.ex:860: Process.info/2\n    (ash 2.19.14) lib/ash/error/exception.ex:59: Ash.Error.Unknown.\"exception (overridable 2)\"/1\n    (ash 2.19.14) lib/ash/error/error.ex:600: Ash.Error.choose_error/2\n    (ash 2.19.14) lib/ash/error/error.ex:260: Ash.Error.to_error_class/2\n    (ash 2.19.14) lib/ash/actions/read/read.ex:281: Ash.Actions.Read.do_run/3\n    (ash 2.19.14) lib/ash/actions/read/read.ex:49: anonymous fn/3 in Ash.Actions.Read.run/3\n    (ash 2.19.14) lib/ash/actions/read/read.ex:48: Ash.Actions.Read.run/3\n    iex:1: (file)\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspacebat%2Fdyndb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspacebat%2Fdyndb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspacebat%2Fdyndb/lists"}