2011-04-27 22 views
6

Tôi có một số mô hình SQLAlchemy tiêu chuẩn mà tôi sử dụng lại trên các dự án. Một cái gì đó như thế này:Sử dụng lại các mô hình SQLAlchemy qua các dự án

from sqlalchemy import Column, Integer, String, Unicode 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class Category(Base): 
    __tablename__ = 'category' 

    id = Column(Integer, primary_key=True) 
    slug = Column(String(250), nullable=False, unique=True) 
    title = Column(Unicode(250), nullable=False) 

    def __call__(self): 
     return self.title 

Tôi muốn đặt điều này trong một thư viện chia sẻ và nhập nó vào mỗi dự án mới thay vì cắt và dán nó, nhưng tôi không thể, vì dụ declarative_base được định nghĩa riêng trong dự án. Nếu có nhiều hơn, họ sẽ không chia sẻ phiên. Tôi làm cách nào để giải quyết vấn đề này?

Here's another question that suggests using mixin classes. Có thể làm việc đó? SQLAlchemy có nhập chính xác khóa ngoại từ các lớp mixin không?

+0

Bạn đang làm gì với các đối tượng cơ sở sau này? Cuối cùng tôi nhớ, tôi đã có thể hợp nhất nhiều siêu dữ liệu với nhau từ nhiều đối tượng Base bằng cách liên kết tất cả chúng với cùng một công cụ. Tôi sẽ tưởng tượng rằng nó sẽ là đủ để sử dụng một phiên từ động cơ đó để truy cập vào tất cả các bảng bạn đã xác định. –

+0

Không có gì thêm với đối tượng Cơ sở. Nếu ràng buộc với siêu dữ liệu là tất cả phải mất, tôi có thể dễ dàng nhập và rebind - trong khi đảm bảo rằng hai ứng dụng riêng biệt không chạy trong cùng một quá trình Python. –

Trả lời

3

Khi bạn gọi

Base = declarative_base()

SA tạo mới metadata cho Base này.

Để sử dụng lại mô hình của bạn, bạn phải ràng buộc metadata các mô hình chính với các mô hình tái sử dụng, nhưng trước khi bất kỳ nhập khẩu các mô hình tái sử dụng của bạn bằng cách:

Base.metadata = my_main_app.db.metadata

lớp mixin hữu ích cho lặp lại tờ khai cột, và mở rộng các phương thức lớp . Đối với connecting các ứng dụng có thể tái sử dụng dựa trên MixIns, bạn phải xác định lớp bê tông trong hướng dẫn sử dụng mã cho từng mô hình.

SQLAlchemy có nhập chính xác khóa ngoại từ các lớp mixin không?

lớp mixin với chính nước ngoài và hạn chế

from sqlalchemy.schema import UniqueConstraint 
from sqlalchemy.ext.declarative import declared_attr 

class MessageMixIn(object): 
    ttime = Column(DateTime) 

    @declared_attr 
    def sometable_id(cls): 
     return Column(Integer, ForeignKey('sometable.id')) 

    @declared_attr 
    def __table_args__(cls): 
     return (UniqueConstraint('sometable_id', 'ttime'), {}) 
+0

Cảm ơn. Hãy để tôi thử điều đó. –

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