Each Ecto schema module exports an __schema__/1
function that you can use for reflection. The following snippet is probably a bad idea but here’s an example of getting all schemas/tables for hexpm project:
iex> app = :hexpm
iex> {:ok, modules} = :application.get_key(app, :modules)
iex> Enum.map(modules, fn mod -> function_exported?(mod, :__schema__, 1) && {mod, mod.__schema__(:source)} end) |> Enum.filter(& &1)
[
{Hexpm.Accounts.AuditLog, "audit_logs"},
{Hexpm.Accounts.Email, "emails"},
{Hexpm.Accounts.Key, "keys"},
{Hexpm.Accounts.Key.Use, nil},
{Hexpm.Accounts.KeyPermission, nil},
{Hexpm.Accounts.Organization, "organizations"},
{Hexpm.Accounts.OrganizationUser, "organization_users"},
{Hexpm.Accounts.PasswordReset, "password_resets"},
{Hexpm.Accounts.Session, "sessions"},
{Hexpm.Accounts.User, "users"},
{Hexpm.Accounts.UserHandles, nil},
{Hexpm.BlockAddress.Entry, "blocked_addresses"},
{Hexpm.Repository.Download, "downloads"},
{Hexpm.Repository.Install, "installs"},
{Hexpm.Repository.Package, "packages"},
{Hexpm.Repository.PackageDependant, "package_dependants"},
{Hexpm.Repository.PackageDownload, "package_downloads"},
{Hexpm.Repository.PackageMetadata, nil},
{Hexpm.Repository.PackageOwner, "package_owners"},
{Hexpm.Repository.Release, "releases"},
{Hexpm.Repository.ReleaseDownload, "release_downloads"},
{Hexpm.Repository.ReleaseMetadata, nil},
{Hexpm.Repository.ReleaseRetirement, nil},
{Hexpm.Repository.Repository, "repositories"},
{Hexpm.Repository.Requirement, "requirements"}
]
the ones with nil are embedded schemas.