2015-05-20 33 views
7

Làm cách nào để tạo mối quan hệ mà không có khóa ngoại?Xác định mối quan hệ không có khóa ngoài

@declared_attr 
def custom_stuff(cls): 
    joinstr = 'foreign(Custom.name) == "{name}"'.format(name=cls.__name__) 
    return db.relationship('Custom', primaryjoin=joinstr) 

Điều này đặt ra một lỗi:
ArgumentError: Could not locate any simple equality expressions involving locally mapped foreign key columns for primary join condition

này hoạt động, nhưng tôi nghĩ đó là một hack khá xấu xí.

@declared_attr 
def custom_stuff(cls): 
    joinstr = 'or_(
        and_(foreign(Custom.name) == MyTable.title, 
         foreign(Custom.name) != MyTable.title), 
        foreign(Custom.name) == "{name}")'.format(name=cls.__name__) 
    return db.relationship('Custom', primaryjoin=joinstr) 

Có cách nào tốt hơn để thực hiện việc này không?

CHỈNH SỬA: thuộc tính bổ sung cần phải được thêm làm @declared_attr và phải sử dụng mối quan hệ vì trình nối tiếp của chúng tôi được viết sao cho nó hoạt động với attrs được khai báo.

Làm điều này với @hybrid_property hoặc một cái gì đó khác sẽ hoạt động, nhưng sau đó bộ nối tiếp json của chúng tôi sẽ bị hỏng. Việc đó có vẻ khó hơn việc xác định mối quan hệ.

Trả lời

-2

Có thể bạn nên trỏ đến ý nghĩa của từ "mối quan hệ". Nó nói rằng một số điều "phụ thuộc" vào một số thứ khác hoặc cả hai đều phụ thuộc lẫn nhau. Nếu bạn đang cố gắng xác định mối quan hệ trên ERM (Mô hình mối quan hệ thực thể) có nghĩa là bạn nên nêu rõ một trong những thực thể "phụ thuộc" vào đối tượng khác. Ngoài ra, cơ sở dữ liệu có một số hacks để đối phó nhanh hơn với các bảng liên quan đến nhau hơn là các bảng đơn giản có liên quan trên một cách trừu tượng trên. Có lý do nào khiến bạn cần phải làm điều đó không?

+0

Điều này không cung cấp câu trả lời cho câu hỏi. – SaeX

0

Bạn không nhất thiết phải xác định mối quan hệ khi tạo bảng trong cơ sở dữ liệu (điều này áp dụng cho hầu hết mọi SQL). Bạn vẫn có thể tham gia các bảng không có quan hệ khóa ngoài được xác định trước (lý do chính cho khóa ngoài là thực thi tính nhất quán của dữ liệu, không phải để xác định những gì bạn có thể tham gia hay không).

Xem này để tham khảo - http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join

Nếu bạn vẫn muốn "show" cơ sở dữ liệu và bảng cấu trúc/mô hình, sau đó sử dụng tốt hơn một số mối quan hệ thực thể modeler như Erwin (hoặc một số phần mềm biểu đồ).

+0

thêm tại đây - http://stackoverflow.com/questions/5771190/can-we-join-two-tables-without-primary-foreign-key-relation – kasparg

+1

Chỉnh sửa, tôi "nên" có thể xác định mối quan hệ mà không cần bỏ phím. Vấn đề là sqlalchemy ném một lỗi trong trường hợp đó, và tôi muốn tìm hiểu làm thế nào để làm cho công việc đó. – zidarsk8

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