2011-01-19 28 views
5

Tôi đang sử dụng cơ sở khai báo SQLAlchemy để xác định mô hình của mình. Tôi định nghĩa một tài sản name được tính toán từ một trong các cột (title):SQLAlchemy: truy vấn thuộc tính tùy chỉnh dựa trên trường bảng

class Entry(Base): 
    __tablename__ = "blog_entry" 
    id = Column(Integer, primary_key=True) 
    title = Column(Unicode(255)) 
    ... 

    @property 
    def name(self): 
     return re.sub(r'[^a-zA-Z0-9 ]','',self.title).replace(' ','-').lower() 

Khi cố gắng để thực hiện một truy vấn sử dụng name, SQLAlchemy ném một lỗi:

Session.query(Entry).filter(Entry.name == my_name).first() 
>>> ArgumentError: filter() argument must be of type sqlalchemy.sql.ClauseElement or string 

Sau khi điều tra một thời gian, Tôi thấy rằng có lẽ comparable_using() có thể giúp, nhưng tôi không thể tìm thấy bất kỳ ví dụ nào cho thấy một bộ so sánh tham chiếu đến một cột khác của bảng.

Điều này có thể thực hiện được hoặc có cách tiếp cận tốt hơn không?

Trả lời

5

Bạn có thể tưởng tượng SQL nào sẽ được phát hành cho truy vấn của mình không? Cơ sở dữ liệu không biết gì về name, nó không có cách nào để tính toán nó, cũng như không sử dụng bất kỳ chỉ mục nào để tăng tốc độ tìm kiếm.

Đặt cược tốt nhất của tôi là quét toàn bộ, tìm nạp title cho mỗi bản ghi, tính name rồi lọc theo. Bạn có thể làm điều đó một cách thô bạo theo số [x for x in Session.query(Entry).all() if x.name==my_name][0]. Với một chút tinh tế hơn, bạn sẽ chỉ tìm nạp idtitle trong đường lọc, sau đó tìm nạp (các) bản ghi đầy đủ theo id.

Lưu ý rằng quét toàn bộ thường không tốt với hiệu suất POV, trừ khi bảng của bạn khá nhỏ.

+0

Cảm ơn, bây giờ tôi thấy rằng tôi phải cố gắng tiếp cận khác. – amercader

5

Từ SQLAlchemy 0.7 bạn có thể đạt được điều này bằng hybrid_property thấy các tài liệu ở đây: http://www.sqlalchemy.org/docs/orm/extensions/hybrid.html

+0

Có thể đưa ra một ví dụ về cách sử dụng điều này để thực hiện chuỗi thay thế như trên không? Tôi nhận được những thứ như 'TypeError: chuỗi dự kiến ​​hoặc bộ đệm' và' AttributeError: Không đối tượng 'InstrumentedAttribute' cũng như đối tượng 'Comparator' được kết hợp với Entry.page_title có thuộc tính 'partition'' nhưng tôi đang cố xử lý đối tượng của mình page_title là một chuỗi mà tôi có thể thấy nó không ... Không chắc chắn làm thế nào để có được giá trị chuỗi mặc dù. – Katie

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