2012-01-19 14 views
20

क्या उस तालिका के लिए ट्रिगर्स और इंडेक्स को परिभाषित/बनाने के लिए तालिका के SQLAlchemy क्लास में कोई तरीका है?स्क्लेक्लेमी घोषणात्मक: ट्रिगर्स और इंडेक्स को परिभाषित करना (पोस्टग्रेस 9)

उदाहरण के लिए अगर मैं एक बुनियादी मेज की तरह था ...

class Customer(DeclarativeBase): 
    __tablename__ = 'customers' 
    customer_id = Column(Integer, primary_key=True,autoincrement=True) 
    customer_code = Column(Unicode(15),unique=True) 
    customer_name = Column(Unicode(100)) 
    search_vector = Column(tsvector) ## *Not sure how do this yet either in sqlalchemy*. 

मैं अब "search_vector" अद्यतन करने के लिए ट्रिगर बनाने का

CREATE TRIGGER customers_search_vector_update BEFORE INSERT OR UPDATE 
ON customers 
FOR EACH ROW EXECUTE PROCEDURE 
tsvector_update_trigger(search_vector,'pg_catalog.english',customer_code,customer_name); 

तब मैं उस क्षेत्र भी जोड़ना चाहते थे चाहते हैं एक सूचकांक के रूप में ...

create index customers_search_vector_indx ON customers USING gin(search_vector); 

अभी मेरे ऐप से किसी भी तरह का डेटाबेस पुनर्जन्म करने के बाद मुझे टी करना है वह tsvector कॉलम, ट्रिगर परिभाषा, और फिर psql से सूचकांक कथन के लिए कॉलम जोड़ें। दुनिया का अंत नहीं बल्कि एक कदम भूलना आसान है। मैं स्वचालन के बारे में सब कुछ हूं इसलिए यदि मैं ऐप सेटअप के दौरान यह सब कुछ प्राप्त कर सकता हूं तो बोनस!

+0

जहां आप एक व्याख्याकर्ता कॉलम बनाने के तरीके को खोजने में सक्षम हैं? – d0ugal

उत्तर

34

इंडस्ट्रीज बनाने के लिए सीधे आगे हैं। index=True पैरामीटर नीचे की तरह साथ एकल-स्तंभ के लिए:

customer_code = Column(Unicode(15),unique=True,index=True) 

लेकिन आप नाम और विकल्पों पर अधिक नियंत्रण चाहते हैं, तो स्पष्ट Index() निर्माण का उपयोग करें:

Index('customers_search_vector_indx', Customer.__table__.c.search_vector, postgresql_using='gin') 

ट्रिगर रूप में अच्छी तरह बनाया जा सकता है , लेकिन उन्हें अभी भी SQL होना चाहिए और DDL ईवेंट पर लगाया गया है। अधिक जानकारी के लिए Customizing DDL देखें, लेकिन कोड इस के समान दिख सकता है:

from sqlalchemy import event, DDL 
trig_ddl = DDL(""" 
    CREATE TRIGGER customers_search_vector_update BEFORE INSERT OR UPDATE 
    ON customers 
    FOR EACH ROW EXECUTE PROCEDURE 
    tsvector_update_trigger(search_vector,'pg_catalog.english',customer_code,customer_name); 
""") 
tbl = Customer.__table__ 
event.listen(tbl, 'after_create', trig_ddl.execute_if(dialect='postgresql')) 

Sidenote: मैं tsvector डेटाप्रकार कॉन्फ़िगर कैसे पता नहीं है: एक अलग प्रश्न के योग्य है।

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