この記事では主に Python での SQLAlchemy ソートに関する落とし穴を紹介します。詳細なサンプルコードが記載されています。興味のある方はぜひ参考にしてください。
はじめに
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 での並べ替えにおけるよくある間違いを簡単に説明しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。