2012-01-19 23 views
20

Có cách nào trong lớp SQLAlchemy của bảng để xác định/tạo trình kích hoạt và chỉ mục cho bảng đó không?Tuyên bố SQLAlchemy: xác định trình kích hoạt và chỉ mục (Postgres 9)

Ví dụ nếu tôi đã có một bảng cơ bản như ...

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*. 

bây giờ tôi muốn tạo ra một kích hoạt để cập nhật "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); 

Sau đó, tôi muốn thêm lĩnh vực đó cũng làm chỉ mục ...

create index customers_search_vector_indx ON customers USING gin(search_vector); 

Ngay bây giờ sau khi tôi thực hiện bất kỳ loại tái tạo cơ sở dữ liệu nào từ ứng dụng của tôi, tôi phải làm anh ta thêm cột cho cột tsvector, định nghĩa trigger, và sau đó là câu lệnh index từ psql. Không phải là kết thúc của thế giới nhưng nó dễ quên một bước. Tôi tất cả về tự động hóa vì vậy nếu tôi có thể nhận được tất cả điều này xảy ra trong quá trình thiết lập ứng dụng thì hãy thưởng!

+0

Nơi bạn có thể tìm hiểu cách tạo cột tsvector? – d0ugal

Trả lời

34

Chính sách là đơn giản để tạo. Đối với một cột với index=True thông số như dưới đây:

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

Nhưng nếu bạn muốn kiểm soát nhiều hơn các tên và các tùy chọn, sử dụng rõ ràng Index() xây dựng:

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

Triggers có thể được tạo ra cũng nhưng những nhu cầu đó vẫn phải là SQL dựa trên và được nối với sự kiện DDL. Xem Customizing DDL để biết thêm, nhưng mã có thể trông tương tự như sau:

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: Tôi không biết làm thế nào để cấu hình tsvector datatype: xứng đáng là một câu hỏi riêng biệt.

Các vấn đề liên quan