0

これは簡単なように思えますが、残念ながら:

次の SQLAlchemy クエリ オブジェクトがあります。

all = db.session.query(label('sid', distinct(Clinical.patient_sid))).all()

[{'sid': 1}, {'sid': 2},...] のように出力をシリアライズしたい場合

これを行うために、次の単純なマシュマロ スキーマを使用しようとしています。

class TestSchema(Schema):
    sid = fields.Int()

しかし、私がするとき

schema = TestSchema()
result = schema.dump(record)
print result
pprint(result.data)

私は得る:

MarshalResult(data={}, errors={})
{}

私の出力のために。

ただし、クエリから 1 行だけを選択すると、たとえば、

one_record = db.session.query(label('sid', distinct(Clinical.patient_sid))).first()

望ましい結果が得られます。

MarshalResult(data={u'sid': 1}, errors={})
{u'sid': 1}

.all() を使用したクエリがデータを返していることは知っています。これを印刷すると、タプルのリストが得られるためです。

[(1L,), (2L,), (3L,), ...]

マシュマロはタプルのリストを処理できると想定しています。なぜなら、serialize メソッドの下の marshaling.py のドキュメントでは、「生データ (dict、リスト、またはその他のオブジェクト) と dict を取得する...」と書かれているからです。 、これは、タプルのリストが「リスト」または「その他のオブジェクト」のいずれかに分類される可能性があると考えるのは間違った仮定である可能性があります。

それ以外の場合はマシュマロが好きで、次のような反復メソッドを使用して SQLAlchemy 出力をシリアル化するよりも最適化として使用することを望んでいました。

all = db.session.query(label('sid', distinct(Clinical.patient_sid)))

out = []
for result in all:
    data = {'sid': result.sid}
    out.append(data)

これは、大規模なレコード セットの場合、処理に時間がかかる場合があります。

編集

Marshmallow が SQLAlchemy による出力としてレコード セット全体をシリアル化できたとしても、データを反復処理しすぎているように見えるため、速度が向上するかどうかはわかりません。

Clinicalのクラス定義を変更する以外に、SQLAlchemy出力の最適化されたシリアライゼーションに関する提案はありますか?

4

1 に答える 1

0

私のコードを最適化する解決策は、SQLAlchemy クエリ オブジェクトから pandas データ フレームに直接移動することでした (クエリされたレコード セットを取得した後、pandas で重い作業を行っていることを忘れていました)。

したがって、このステップをスキップできました

out = []
for result in all:
    data = {'sid': result.sid
    out.append(data)

sql_read次のようにパンダの方法を使用して:

import pandas as pd

pd.read_sql(all.statement, all.session.bind)

次に、すべてのデータ操作と回転を実行することで、処理時間を数秒短縮しました。

于 2016-02-17T03:43:46.173 に答える