Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to represent a custom PostgreSQL domain in SQLAlchemy?

I'm beginning to incorporate Alembic into my project which already uses SQLAlchemy table definitions. At present my DB schema is managed external to my application, and I want to bring the entire schema into my table definitions file.

In PostgreSQL I use a custom domain for storing email addresses. The PostgreSQL DDL is:

CREATE DOMAIN email_address TEXT CHECK (value ~ '.+@.+')

How do I represent the creation of this domain, and the usage of it as a column data type, in SQLAlchemy?

like image 885
skyler Avatar asked Sep 06 '13 16:09

skyler


1 Answers

One of the reasons for using something like SQLAlchemy is DB independence (apart from the ORM stuff).

However, using low-level constructs like this which are often very DB specific make "DB independence" a non-argument, so I would opt for writing a simple op.execute in your alembic migration.

This is often a very acceptable trade-off as it makes the source code much simpler and this less error-prone.

If you are relying on features of a DB which are only available in one DB-backend (another example might be ltree or hstore from PostgreSQL), then I don't see any issue in using a migration which will also only work on that targeted back-end.

So you could just do:

def upgrade():
    op.execute("CREATE DOMAIN ...")

def downgrade():
    op.execute("DROP DOMAIN ...")

If on the other hand you plan on supporting different back-ends this won't work.

like image 117
exhuma Avatar answered Sep 28 '22 17:09

exhuma