2012-02-03 38 views
5

Tôi đang sử dụng SQLAlchemy recipe here đến kỳ diệu JSON mã hóa/giải mã một cột từ DB trong mô hình của tôi như:SQLAlchemy cột đồng nghĩa với nhau kiểu

class Thing(Base): 
    __tablename__ = 'things' 
    id = Column(Integer(), primary_key=True) 
    data = Column(JSONEncodedDict) 

tôi trúng một snag khi tôi muốn tạo ra một thêm "raw_data" trường trong mô hình của tôi để truy cập dữ liệu JSON cơ bản giống nhau, nhưng không có mã hóa/giải mã nó:

raw_data = Column("data", VARCHAR) 

SQLAlchemy dường như bị lẫn lộn bởi tên va chạm và để lại một cột un-ánh xạ. Có cách nào tôi có thể thuyết phục SQLAlchemy để thực sự bản đồ cả hai thuộc tính cho cùng một cột?

Trả lời

3

Tôi chỉ xác định cột raw_data thông qua SQLAlchemy và sau đó sử dụng thuộc tính/bộ đặt của Python để sử dụng trong suốt data. I.e .:

class Thing(Base): 
    __tablename__ = 'things' 
    id = Column(Integer(), primary_key=True) 
    raw_data = Column(String()) 

    @property 
    def data(self): 
     # add some checking here too 
     return json.loads(self.raw_data) 

    @data.setter 
    def data(self, value): 
     # dito 
     self.raw_data = json.dumps(value) 
+0

Có 2 vấn đề: 1) nó không xử lý đột biến tại chỗ đúng cách, 2) JSON được phân tích cú pháp cho từng quyền truy cập thuộc tính. –

+0

@Denis: Theo dõi đột biến tại chỗ gần như là trực giao. Tôi đã được tinkering với nó, và có nhiều hơn nữa để nó hơn ví dụ trong các tài liệu ngụ ý: https://gist.github.com/1730610. –

+0

@DenisOtkidach, sự cố thứ hai có thể dễ dàng được giải quyết bằng cách lưu vào bộ nhớ cache. Đó là loại tối ưu hóa sớm mặc dù vậy tôi đã không bao gồm nó ngay lập tức. Tôi không có nhiều kinh nghiệm với SQLAlchemy nói riêng nhưng từ những gì tôi thu thập giải pháp này không phải là một cách tiếp cận không phổ biến. –

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