2013-09-06 12 views
7

Alembic'i zaten SQLAlchemy tablo tanımlarını kullanan projeme dahil etmeye başladım. Şu anda DB şemam uygulamamın dışından yönetiliyor ve tüm şemayı tablo tanımları dosyama getirmek istiyorum.SQLAlchemy'de özel bir PostgreSQL etki alanı nasıl temsil edilir?

PostgreSQL'de e-posta adreslerini saklamak için özel bir etki alanı kullanıyorum. PostgreSQL DDL geçerli:

CREATE DOMAIN email_address TEXT CHECK (value ~ '[email protected]+') 

nasıl sqlalchemy bu etki oluşturulmasını ve bir sütun veri türü olarak kullanımını, temsil ediyor?

+1

Bu soru biraz daha gelişmiş gibi görünüyor, belki de SQLAlchemy listesinde daha iyi yardım bulabilirsiniz. Türün kullanımı için 'TEXT' alt sınıfının bir yolunu bulmayı ve adını 'email_address' olarak değiştirmeyi öneririm. Bu en basit yol olurdu (ama nasıl yapacağımı bilmiyorum). İkinci bölüm muhtemelen SQL tarafından yapılabilir, çünkü SQLAlchemy'nin henüz var olmayan türleri oluşturmak için bir arayüze sahip olduğundan emin değilim. – javex

+0

@javex şimdilik özel DDL yayınlayarak etki alanı oluşturuyorum ve 'typeDefinedType' alt sütununu 'e-posta_adresi' sütun türü tanımı için döndürmek üzere alt sınıflara ayırdım. İdeal değil ama yeterince iyi çalışıyor. SQLA listesine bakabilirim, bu öneri için teşekkür ederim. – skyler

cevap

0

Bu büyük olasılıkla bir çalışma çözümünden çok uzak, ancak bunu yapmanın en iyi yolunun sqlalchemy.schema._CreateDropBase numaralı alt sınıf olabileceğini düşünüyorum.

from sqlalchemy.schema import _CreateDropBase 

class CreateDomain(_CreateDropBase): 
    '''Represent a CREATE DOMAIN statement.''' 

    __visit_name__ = 'create_domain' 

    def __init__(self, element, bind=None, **kw): 
     super(CreateDomain, self).__init__(element, bind=bind, **kw) 

class DropDomain(_CreateDropBase): 
    '''Represent a DROP BASE statement.''' 

    __visit_name__ = 'drop_domain' 

    def __init__(self, element, bind=None, **kw): 
     super(DropDomain, self).__init__(element, bind=bind, **kw) 

@compiles(CreateDomain, 'postgresql') 
def visit_create_domain(element, compiler, **kw): 
    text = '\nCREATE DOMAIN %s AS %s' % (
     compiler.prepare.format_column(element.name), 
     compiler.preparer.format_column(element.type_)) # doesn't account for arrays and such I don't think 

    default = compiler.get_column_default_string(column) 
    if default is not None: 
     text += " DEFAULT %s" % default 

    return text 

Açıkçası, bu eksik, ama bu kötü yeterince istiyorsanız size iyi bir başlangıç ​​noktası vermelidir. :)