2012-03-25 32 views
19

Models

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, ForeignKey 
from sqlalchemy import Integer 
from sqlalchemy import Unicode 
from sqlalchemy import TIMESTAMP 
from sqlalchemy.orm import relationship 

BaseModel = declarative_base() 

class Base(BaseModel): 
    __tablename__ = 'base' 
    id = Column(Integer, primary_key=True) 
    location = Column(Unicode(12), ForeignKey("locationterrain.location"), unique=True,) 
    name = Column(Unicode(45)) 
    ownerid = Column(Integer,ForeignKey("player.id")) 
    occupierid = Column(Integer, ForeignKey("player.id")) 
    submitid = Column(Integer,ForeignKey("player.id")) 
    updateid = Column(Integer,ForeignKey("player.id")) 
    owner = relationship("Player", 
     primaryjoin='Base.ownerid==Player.id', 
     join_depth=3, 
     lazy='joined') 
    occupier= relationship("Player", 
     primaryjoin='Base.occupierid==Player.id', 
     join_depth=3, 
     lazy='joined') 
    submitter = relationship("Player", 
     primaryjoin='Base.submitid== Player.id', 
     join_depth=3, 
     lazy='joined') 
    updater= relationship("Player", 
     primaryjoin='Base.updateid== Player.id', 
     join_depth=3, 
     lazy='joined') 


class Player(BaseModel): 
    __tablename__ = 'player' 
    id = Column(Integer, ForeignKey("guildmember.playerid"), primary_key=True) 
    name = Column(Unicode(45)) 

Tìm kiếm

bases = dbsession.query(Base) 
bases = bases.order_by(Base.owner.name) 

này không hoạt động .... Tôi đã tìm kiếm khắp nơi và đọc tài liệu. Nhưng tôi không thấy cách tôi có thể sắp xếp truy vấn (Cơ sở) của tôi trên tên của mối quan hệ 'chủ nhân' của họ.SQLAlchemy: Làm thế nào để đặt hàng kết quả truy vấn (order_by) trên trường của mối quan hệ?

Nó luôn luôn dẫn đến:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'name' 

này phải được dễ dàng ... nhưng tôi không nhìn thấy nó. Ngoài ra nhìn vào Comparators, mà có vẻ hợp lý, nhưng tôi không thấy nơi phần truy vấn cho ORDER BY được tạo ra hoặc những gì tôi nên được trả lại vì tất cả mọi thứ được tạo động. Và làm cho một so sánh cho mỗi mối quan hệ 'người chơi' của tôi để làm một điều đơn giản có vẻ phức tạp hơn.

Trả lời

30

SQLAlchemy muốn bạn suy nghĩ về mặt SQL. Nếu bạn thực hiện truy vấn cho "Cơ sở", đó là:

SELECT * FROM base 

dễ dàng. Vì vậy, làm thế nào, trong SQL, bạn sẽ chọn các hàng từ "cơ sở" và thứ tự của cột "tên" trong một bảng hoàn toàn khác nhau, đó là, "người chơi"? Bạn sử dụng một tham gia:

SELECT base.* FROM base JOIN player ON base.ownerid=player.id ORDER BY player.name 

SQLAlchemy có bạn sử dụng quá trình suy nghĩ giống hệt nhau - bạn tham gia():

session.query(Base).join(Base.owner).order_by(Player.name) 
+0

Điều đó làm cho ý nghĩa. Nhưng điều đó có nghĩa là tôi chỉ có thể tham gia một trong những mối quan hệ của người chơi tại một thời điểm đúng không? Tham gia nhiều hơn (vì bất kỳ lý do gì ..) có nghĩa là phá vỡ nội dung. Vì vậy, nếu tôi muốn đặt hàng bằng cách cập nhật, tôi phải làm điều này: session.query(Base).join(Base.updater).order_by(Player.name) hoặc 'chiếm đóng': session.query (Base) .join (Base.occupier) .order_by (Player.name) –

+2

bạn có thể tham gia vào một bảng nhất định bất kỳ số lần nào bằng cách sử dụng bí danh của bảng đó. một lần nữa đây là một khái niệm SQL, vì vậy biết cách giải quyết vấn đề trong SQL có nghĩa là bạn sẽ biết cách giải quyết nó trong SQLAlchemy. Bí danh được giới thiệu lần đầu tiên tại http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#using-aliases. – zzzeek

+0

Câu trả lời này sẽ lọc ra bất kỳ đối tượng 'base' nào trong đó' base.ownerid' là null. Bạn có biết làm thế nào để sửa đổi cách tiếp cận để đặt hàng theo giá trị mối quan hệ, nhưng không loại trừ các đối tượng không có giá trị trong mối quan hệ? (có lẽ đặt hàng những người không có mối quan hệ cuối cùng hoặc đầu tiên) – melchoir55

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