0

モデルは次のようになります(SQLAlchemyで):

Class Cell(Base):
    __tablename__ = "cell"
    id = Column(Integer)
    name = Column(String)

Class Sample(Base):
    __tablename__ =  "cell"
    id = Column(Integer)
    factor_id = Column(Integer, ForeignKey("cell.id"))
    cell = relationship(Cell, backref = 'sample', order_by = "Cell.id")

次のようにクエリを実行すると:

DBSession.query(Sample).filter(Sample.cell.name == "a_string")

次のような例外をスローします。

File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/attributes.py", line 139, in __getattr__
key)
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute  'name'

classのcellフィールドにSampleというフィールドがないようnameです。次に、フィールドを使用Cell.nameしてSampleクラスでクエリを実行するにはどうすればよいですか? cell誰かがこれについてアイデアを持っていますか?

ありがとう!

4

1 に答える 1

1

それを達成するには、さまざまな方法があります。

1. join(...) を使用 - あなたの場合はこれを選択します

qry = session.query(Sample).join(Cell).filter(Cell.name == "a_string")

>> SELECT sample.id AS sample_id, sample.factor_id AS sample_factor_id
>> FROM sample JOIN cell ON cell.id = sample.factor_id
>> WHERE cell.name = :name_1

2. any/has(...) を使用 - これはサブクエリを使用します

qry = session.query(Sample).filter(Sample.cell.has(Cell.name == "a_string"))

>> SELECT sample.id AS sample_id, sample.factor_id AS sample_factor_id
>> FROM sample
>> WHERE EXISTS (SELECT 1
>> FROM cell
>> WHERE cell.id = sample.factor_id AND cell.name = :name_1)
于 2012-11-16T09:30:07.367 に答える