2010-05-27 32 views
23

Tôi không có chuyên gia về cơ sở dữ liệu - tôi chỉ biết những điều cơ bản, thực sự. Tôi đã chọn SQLAlchemy cho một dự án nhỏ và tôi đang sử dụng cấu hình cơ sở khai báo thay vì cách "bình thường". Cách này có vẻ đơn giản hơn rất nhiều.các mối quan hệ SQLAlchemy đơn giản hoạt động như thế nào?

Tuy nhiên, trong khi thiết lập lược đồ cơ sở dữ liệu của tôi, tôi nhận ra rằng tôi không hiểu một số khái niệm mối quan hệ cơ sở dữ liệu.

Nếu tôi có mối quan hệ nhiều người, ví dụ, bài viết của tác giả (mỗi bài viết có thể được viết bởi một tác giả), tôi sẽ đặt trường author_id trong cột articles của tôi. Nhưng SQLAlchemy có đối tượng ForeignKey này, và một hàm quan hệ với một backw kwarg, và tôi không có ý tưởng gì về nó MEANS.

Tôi sợ phải tìm ra mối quan hệ nhiều - nhiều với bảng trung gian như thế nào (khi tôi cần thêm dữ liệu về mỗi mối quan hệ).

Ai đó có thể làm rõ điều này cho tôi không? Ngay bây giờ tôi đang thiết lập để cho phép auth openID cho ứng dụng của tôi. Vì vậy, tôi đã nhận điều này:

from __init__ import Base 
from sqlalchemy.schema import Column 
from sqlalchemy.types import Integer, String 

class Users(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    username = Column(String, unique=True) 
    email = Column(String) 
    password = Column(String) 
    salt = Column(String) 


class OpenID(Base): 
    __tablename__ = 'openid' 
    url = Column(String, primary_key=True) 
    user_id = #? 

Tôi nghĩ rằng ? nên được thay thế bởi Column(Integer, ForeignKey('users.id')), nhưng tôi không chắc chắn - và tôi cần phải đặt openids = relationship("OpenID", backref="users") trong lớp Người dùng? Tại sao? Nó làm gì? Một backref là gì?

Trả lời

35

Có, bạn cần user_id = Column(Integer, ForeignKey('users.id')) hoặc user_id = Column(Integer, ForeignKey('users.id'), nullable=False) nếu bắt buộc. Điều này được dịch trực tiếp sang NGOẠI CHÍNH trong lược đồ cơ sở dữ liệu cơ bản, không có phép thuật.

Cách đơn giản để khai báo mối quan hệ là user = relationship(Users) trong lớp OpenID. Bạn cũng có thể sử dụng users = relationship('OpenID') trong lớp Users. Tham số backref cho phép bạn khai báo cả hai mối quan hệ với khai báo đơn: nó có nghĩa là tự động cài đặt mối quan hệ ngược trong lớp liên quan. Cá nhân tôi thích sử dụng backref -s chỉ cho các mối quan hệ tự giới thiệu. Lý do là tôi thích mã tự viết: khi bạn xem xét định nghĩa của nó, bạn sẽ thấy tất cả các thuộc tính được xác định, trong khi với backref bạn cần phải xem qua các lớp khác (có thể được định nghĩa trong các mô-đun khác).

+0

Câu trả lời hay, cảm ơn bạn. Tôi ngạc nhiên quá lâu, và không ai khác trả lời ... Có vẻ như có nhiều thứ mà mọi người sẽ biết. Oh well :) –

+2

Đây là một câu trả lời tuyệt vời, rất rõ ràng. Tôi cũng thích mã tự viết. Với hiệu ứng đó, SQLAlchemy, kể từ 0.5.1, cung cấp một thay thế cho 'backref' là [' back_populates'] (http://docs.sqlalchemy.org/en/latest/orm/relationship_api.html#sqlalchemy.orm. relationship.params.back_populates). Các tài liệu trình bày rõ hơn và ví dụ: http://docs.sqlalchemy.org/en/latest/orm/backref.html#relationships-backref – iled

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