1

データ型としてregion_codewithと呼ばれる列を含むテーブルがあります。Integer私のPythonプログラムには、次の行があります。

region = session.query(Region).filter(Region.region_code/100 == region_prefix).one()

ここで重要な部分は、選択したフィルター方法です

Region.region_code/100 == region_prefix

ここで、region_code はテーブル内の整数列であり、region_prefix 変数は整数値を保持します

は、 (プログラムからの) region_prefix 変数が のような整数値を保持している間、 のregion_codeような値を含むテーブルの整数列です。1199, 1200, 1300, 149911, 12, 13, 14

このフィルター オプションで実現したいことは、 で整数除算を実行してregion_code(したがって、小数点以下をすべて切り捨てて) と比較できるようにすることregion_prefixです。


例:

region_prefix = 11

Region テーブルに次のエントリが存在すると仮定します。

region_code = 1199

フィルター内の計算は次のようになります。

1199 / 100 = 11

したがって、この結果で をフィルタリングできますregion_prefix (11=11)これは、MSSQL (Microsoft) で問題なく動作します。


残念ながら(私の場合)MySQL除算演算子/は整数除算を行いません。したがって、の結果は次の1199/100ようになる11.99ため、クエリは DB で適切なエントリを見つけられません (11.99 != 11 のため)。それにもかかわらず、MySQL には実際に実装された内部除算があります: DIV演算子です。

したがって、次の SQL クエリは問題なく機能します。

SELECT * FROM Region where region_code DIV 100 = 11;


私の質問は次のとおり です。SQLAlchemyfilterメソッドを演算子DIVの代わりに使用するにはどうすればよいですか? /これは可能ですか?または、ネイティブ クエリを使用する唯一の回避策ですか?

4

2 に答える 2

3

幸いなことに、SQLAlchemy ではカスタム演算子を使用できます。これを行う簡単な方法 (単純にクエリで指定する) と、より複雑な方法 (new 演算子を完全に定義し、複数のデータベースに対応させる) があります。したがって、それはあなたが探しているものに依存します。

http://docs.sqlalchemy.org/en/latest/core/custom_types.html?highlight=operators#redefining-and-creating-new-operators

region = (session
    .query(Region)
    .filter(Region.region_code.op('div')(region_prefix))
    .one()
)

そして派手な方法:

http://docs.sqlalchemy.org/en/rel_0_8/core/types.html#types-operators

from sqlalchemy import Integer

class DivisibleInteger(Integer):
    class comparator_factory(Integer.Comparator):
        def div(self, other):
            return self.op('div')(other)
于 2013-01-28T13:20:40.753 に答える
0

Python スクリプトで除算演算を個別に実行し、結果を変数に保存してから、演算の代わりにクエリで変数を渡してみませんか?

于 2013-01-28T13:20:06.407 に答える