2010-07-31 39 views
7

Tôi đang viết một shim sqlalchemy nhỏ để xuất dữ liệu từ cơ sở dữ liệu MySQL với một số phép biến đổi dữ liệu nhẹ - chủ yếu là thay đổi tên trường. Kịch bản hiện tại của tôi hoạt động tốt nhưng yêu cầu tôi về cơ bản mô tả mô hình của tôi hai lần — một lần trong khai báo lớp và một lần như một danh sách các tên trường để lặp lại.SQLAlchemy introspection của các lớp khai báo

Tôi đang cố gắng tìm ra cách sử dụng nội tâm để xác định các thuộc tính trên hàng đối tượng là các trình truy cập cột. Các công việc sau gần như hoàn hảo:

for attr, value in self.__class__.__dict__.iteritems(): 
    if isinstance(value, sqlalchemy.orm.attributes.InstrumentedAttribute): 
     self.__class__._columns.append(attr) 

ngoại trừ việc accessors liên quan tới nhiều tôi cũng là trường hợp của sqlalchemy.orm.attributes.InstrumentedAttribute, và tôi cần phải bỏ qua những. Có cách nào để phân biệt giữa hai trong khi tôi đang kiểm tra từ điển lớp?

Hầu hết tài liệu tôi đang tìm kiếm về nội suy sqlalchemy đều liên quan đến việc tìm kiếm siêu dữ liệu. Tuy nhiên, vì tôi đổi tên cột, dữ liệu đó không dễ dàng tìm được.

Trả lời

1

Tôi vẫn muốn xem câu trả lời cho câu hỏi này, nhưng tôi đã làm việc xung quanh nó bằng cách mang tên những người truy cập mối quan hệ (ví dụ: '_otherentity' thay vì 'otherentity') và sau đó lọc tên. Hoạt động tốt cho mục đích của tôi.

7

Trình ánh xạ của từng thực thể được ánh xạ có thuộc tính columns với tất cả các định nghĩa cột. Ví dụ, nếu bạn có một lớp khai báo User bạn có thể truy cập vào mapper với User.__mapper__ và các cột với:

list(User.__mapper__.columns) 

Mỗi cột có một số thuộc tính, bao gồm name (mà có thể không được giống như các thuộc tính ánh xạ tên key), nullable, unique và vân vân ...

+0

Điều này có vẻ hữu ích hơn việc kiểm tra siêu dữ liệu.tables ['mytable']. Nhưng có vẻ như không cho phép tôi khám phá biến lớp mà bộ mô tả được gán cho lớp thực thể của tôi, vì vậy tôi còn lại với vấn đề ban đầu về cách tạo ra ánh xạ đầu ra các tên thuộc tính lớp cho các giá trị của chúng. –

1

một InstrumentedAttribute dụ có một thuộc tính gọi là impl đó là trong thực tế một ScalarAttributeImpl, một ScalarObjectAttributeImpl, hoặc một CollectionAttributeImpl.

Tôi không chắc chắn nó dễ như thế nào, nhưng tôi chỉ kiểm tra xem nó là cái gì để xác định xem một cá thể cuối cùng sẽ trả về một danh sách hay một đối tượng đơn lẻ.

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