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.
Đ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) –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
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