2017-06-30 11 views
0

私はSQLAlchemyでdistinctを使用しようとしていますが、動作していないようです。distinctを使用したSQLAlchemy

SELECT my_table.data AS my_table_data 
FROM my_table 
None 55 

しかし、その代わりに、私はこの取得しています:私はこのような出力期待

これを実行する
#-*- coding: utf-8 -*- 
from sqlalchemy import create_engine,Column, Integer 
from sqlalchemy.orm import sessionmaker,load_only 
from sqlalchemy.ext.declarative import declarative_base 

engine = create_engine('sqlite:///:memory:') 
Session = sessionmaker(bind=engine) 
session = Session() 
Base = declarative_base() 

class my_class(Base): 
    __tablename__ = 'my_table' 
    id= Column(Integer, primary_key=True) 
    data= Column(Integer) 

Base.metadata.create_all(engine) 

for i in range(10): 
    p=my_class() 
    p.id=i 
    p.data=55 
    session.add(p) 
session.commit() 

s=session.query(my_class).distinct(my_class.data).options(load_only(my_class.data)) 

print (s) 
for a in s.all(): 
    print (a.id,a.data) 

:私はあなたが私の問題を見ることができる少し例を用意し

SELECT DISTINCT my_table.id AS my_table_id, my_table.data AS my_table_data 
FROM my_table 
0 55 
1 55 
2 55 
3 55 
4 55 
5 55 
6 55 
7 55 
8 55 
9 55 

私は間違っていますか?

答えて

3

an entity must have an identity so that a unique row can be identified in the database tableのように、完全なORMエンティティを照会すると、主キーを延期することは意味がありません。したがって、あなたはload_only()を持っていますが、クエリにはプライマリキーが含まれています。あなたはデータのみが必要な場合は、特にそのために問い合わせる必要があります。

In [12]: session.query(my_class.data).distinct().all() 
2017-06-30 12:31:49,200 INFO sqlalchemy.engine.base.Engine SELECT DISTINCT my_table.data AS my_table_data 
FROM my_table 
2017-06-30 12:31:49,200 INFO sqlalchemy.engine.base.Engine() 
Out[12]: [(55)] 

は実際にissue where having load_only() did remove the primary key from the select listありました、そしてそれはfixed in 0.9.5た:

[ORM] [バグ]が変更された

主キー列が常に列のリストに追加されるように、orm.load_only()というふうに動作します。そうしないと、ORMは行のIDをロードできません。明らかに、マッピングされた主キーを延期することができ、ORMは失敗します。これは変更されていません。しかし、load_onlyは本質的に「X以外のすべてを延期する」と言っているので、PK列がこの延期に含まれないことがより重要です。

+0

しかし、クラスが必要なので、後でJSONを取得できます。 –

+0

あなたの質問を拡大して、あなたが実際に何をしているのか、言い換えると[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy -問題)。しかし、とにかく答えはまだ立っている:少なくとも "DISTINCT ON"クエリとORMエンティティの種類を持つことはできません。あなたはDISTINCTを使ってクエリをマップすることができますが、それは別のことです。最後に、ORMエンティティにはIDが必要です。 –

+0

あなたは何か悪いことはしていません、あなたがやろうとしたことはORMで行うことはできません。 –