Postgres ENUM support for Ash.Type.Enum?

Is there support for using Postgres ENUM with Ash.Type.Enum?

I do know that you can do that if you create the migration yourself like it is done in this commit: chore: test enum types · ash-project/ash_postgres@a6577d5 · GitHub

But, the question is more if there is now support for it in the migration layer.

Basically, I would like to be able to create an Ash.TypeEnum and ash_postgres would handle the migration to create the type, add new values, remove old ones, etc.

Postgres Enums can be annoying to maintain if you ever need to change a value etc. if it was me I would use a text column and something similar to Ecto.Enum, not sure if Ash has that, but I imagine it would.

It has, but that became an issue if you have a huge table with a bunch of enums since that will increase the size of the table a lot. At the same time I don’t want to use integers since it decreases readability when querying the DB directly.

AFAIK, that annoying part was more prevalent before Postgres 9 since it could only add new values to the end of the enum. after that you can add in any position.

Also, needing a migration to add/remove values can be seen as something annoying, but it can also be seen as a advantage since it makes sure that no one can add wrong data to it.

True, worst of all is mostly in a distributed application, as the db is central, if you have a few applications running then you got a race condition, especially if you rarely have any low usage periods. But again YMMV, and I have no idea what constraints you’re working with.

Can you elaborate? Is there something wrong with ALTER TYPE?

No there is not something inherently wrong with it, although it does imposes constraints that can be completely avoided by having the logic live in the application, that way you can run two different version of your application without any downtime or performance degradation. As software is rarely set in stone.

Some of the constraints are complicating your migration and deployments due to table lock and consistency issues with application and database.

I’ve worked on codebases that leveraged Postgres Enums heavily, and it can be frustrating, especially when your application is the only writer to the database.

1 Like