はじめに
SQLAlchemy は、Python プログラミング言語の ORM フレームワークであり、データベース API に基づいて構築されており、リレーショナル オブジェクト マッピングを使用してデータベース操作を実行します。つまり、オブジェクトを SQL に変換し、データ API を使用します。 SQLを実行し、実行結果を取得します。最近、SQLAlchemy のソートを使用しているときに落とし穴に遭遇したので、それをまとめてより多くの友人と共有したいと思います。以下に見てみましょう。
チートコード
query = db_session.query(UserVideo.vid, UserVideo.uid, UserVideo.v_width, UserVideo.v_height, UserVideo.create_time, UserVideo.cover, UserVideo.source_url, UserVideo.v_type, UserVideo.category, User.username, User.sex, UserExtraInfo.avatar, UserExtraInfo.watermark) query = query.filter(UserVideo.status == 1, User.uid == UserVideo.uid, UserExtraInfo.uid == UserVideo.uid) query = query.filter(UserVideo.status == 1) query = query.order_by(-UserVideo.vid) query = query.limit(20).all()
チートではないコード
query = db_session.query(UserVideo.vid, UserVideo.uid, UserVideo.v_width, UserVideo.v_height, UserVideo.create_time, UserVideo.cover, UserVideo.source_url, UserVideo.v_type, UserVideo.category, User.username, User.sex, UserExtraInfo.avatar, UserExtraInfo.watermark) query = query.filter(UserVideo.status == 1, User.uid == UserVideo.uid, UserExtraInfo.uid == UserVideo.uid) # .order_by(UserVideo.vid.desc()).limit(20).all() query = query.filter(UserVideo.status == 1) query = query.order_by(UserVideo.vid.desc()) query = query.limit(20).all()
はい、その通りです、速度を遅くしているのは水平バーです。に変更されましたdesc()
関数の速度を 10 倍に向上させることができます
以下に、複数のデータの sqlalchemy 高性能ランダム抽出を添付します
query = db_session.query(UserVideo.vid, UserVideo.uid, UserVideo.v_width, UserVideo.v_height, UserVideo.create_time, UserVideo.cover, UserVideo.source_url, UserVideo.v_type, UserVideo.category, User.username, User.sex, UserExtraInfo.avatar, UserExtraInfo.watermark) query = query.filter(UserVideo.status == 1, User.uid == UserVideo.uid, UserExtraInfo.uid == UserVideo.uid) rvid = db_session.query(func.round(random.random() * func.max(UserVideo.vid)).label('rvid')).subquery() query = query.filter(UserVideo.category == category) query_tail = query query_tail = query_tail.join(rvid, UserVideo.vid > rvid.c.rvid).limit(20).all()
SQLAlchemy の並べ替えの落とし穴に関連するその他の記事については、 Python の場合は、PHP 中国語 Web サイトに注意してください。