2013-09-06 6 views
7

मैं अपनी परियोजना में अलेम्बिक को शामिल करना शुरू कर रहा हूं जो पहले से ही स्क्लाक्लेमी टेबल परिभाषाओं का उपयोग करता है। वर्तमान में मेरी डीबी स्कीमा को मेरे एप्लिकेशन के बाहर प्रबंधित किया गया है, और मैं पूरी स्कीमा को अपनी टेबल परिभाषा फ़ाइल में लाना चाहता हूं।SQLAlchemy में एक कस्टम PostgreSQL डोमेन का प्रतिनिधित्व कैसे करें?

PostgreSQL में मैं ईमेल पते संग्रहीत करने के लिए एक कस्टम डोमेन का उपयोग करता हूं। PostgreSQL DDL है:

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

मैं इस डोमेन के निर्माण, और एक स्तंभ डेटा प्रकार के रूप में उपयोग, SQLAlchemy में कैसे प्रतिनिधित्व करते हैं?

+1

यह प्रश्न थोड़ा और अधिक उन्नत लगता है, शायद आप SQLAlchemy सूची में बेहतर सहायता पा सकते हैं। इस प्रकार के उपयोग के लिए मैं 'टेक्स्ट 'को उप-वर्गीकृत करने और उसका नाम बदलकर' ईमेल_ड्रेस 'में बदलने का सुझाव दूंगा। यह सबसे आसान तरीका होगा (लेकिन मुझे नहीं पता कि यह कैसे करना है)। उत्तरार्द्ध भाग शायद शाब्दिक एसक्यूएल द्वारा किया जा सकता है, क्योंकि मुझे यकीन नहीं है कि स्क्लाक्लेमी के पास ऐसे प्रकार बनाने के लिए एक इंटरफेस है जो अभी तक मौजूद नहीं है। – javex

+0

@javex अब मैं कस्टम डीडीएल जारी करके डोमेन बना रहा हूं और मैंने 'userDefinedType' को अपने कॉलम प्रकार परिभाषा के लिए' email_address' वापस करने के लिए उपclassed है। आदर्श नहीं है लेकिन यह काफी अच्छी तरह से काम करता है। मैं एसक्यूएलए सूची देख सकता हूं, इस सुझाव के लिए धन्यवाद। – skyler

उत्तर

0

यह एक कामकाजी समाधान से बहुत दूर है, लेकिन मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका subclass sqlalchemy.schema._CreateDropBase होगा।

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 

जाहिर है, यह अधूरा है, लेकिन अगर आपको यह बुरी तरह से चाहिए तो यह आपको एक अच्छा प्रारंभिक बिंदु देना चाहिए। :)

संबंधित मुद्दे