[Python] PythonでSHOTGUNにアクセスする (2)

前回でSHOTGUNへのアクセス用のクラスを作るなんとなくの構造を書いたのですが、
今回は実際にアクセスしていく所について。

取得・削除・アップデートなどを行うのは、
各クラスの親になるBase側に作成します。

SHOTGUNにAPIを使用してアクセスする場合には、

 

基本は、取得したいEntityを指定してそれに対してなにかをする
という書き方になります。
(コメントへのレスとかは若干例外)

カスタムエンティティの場合は、設定が面内の「CustomEntityXX」のような名前が
このとき、記載する内容になります。

結果は、find_one で取得した場合はDict型になり
findの場合は、Dict型の配列になります。
fieldsに特になにも入れない場合は、EntityType(type)とID(id)のみが帰ってきます。
(もしかしたらcodeも…記憶が…あいまい)
ので、必要なフィールドはfindの3つめの引数で登録しておく必要があります。

また、取得したい内容は、filtersの指定で取得条件を指定します。

詳細は、APIのドキュメント内に記載されていますが、

[<field>, <relation>, <value(s)>]

条件を検索するフィールドと、どうマッチしたいか(=なのか、含むなのか、notなのか)と
値を、List型で指定します。
Valueの入れ方は、基本はそのFieldタイプに対応したPythonの型でOKで、
FieldがEntityまたはMultEntityの場合は、
{‘type’:XXX,’id’XXX}
こんな感じで、IDとEntity名のみが入ったDict型を指定します。
複数条件がある場合は、この構造を複数フィルターに入れれば、
AND扱いで条件を指定できます。(Anyの場合は別途説明)

この取得結果ですが、基本は各フィールドの形式に反った形で帰ってきます。
日付ならdatetimeになるし、checkboxならばBoolになります。
Entityの場合は、Filterの指定と同じく、Entity名とIDが入ったDict(MultDictの場合はそのList)
を取得することが出来ます。

基本を踏まえてカバーする

コレを踏まえた上で、一番基本的な取得の関数を追加します。

TagのようにProjectに関わらないものにProjectを絞るフィルターを入れるとエラーになってしまうので
クラスの変数で指定した情報を元に、入れるかどうかを指定します。
基本、CustomEntityもよくつかうTaskのようなEntityも基本はProjectを含むので
こういう取得コマンドがわには基本フィルターに入れるようにした方が色々と楽です。

続いて、findで取得。
filtersは、getの引数で指定、取得したいフィールドはベース側と
継承側のクラス(各Entity固有)側で指定しておいたものを必ず入れるようにします。
この取得フィールドの数での速度差は・・・そこまでない気がするので、
個人的には全部入れておく派です。

最後に、実際に取得するのは各固有のクラスオブジェクトにしたいので
自分自身のクラスオブジェクトを作成して、その配列を返すようにします。

よく使う条件での取得を作っておく

基本フィルターを使用しての取得は上でいいのですが、
例えば「IDで取得」とか「名前で取得」のようなものは、個別で作っておきます。

実際、DAEMONを作る時とかで一番使うのはこのID取得。
[[‘id’,’is’,XXX]] 毎度こう入れて取得でも良いのですが、

こうしとけば、 sg.Task.get_from_id(10)
こういう書き方ができるのでわかりやすくなります。

複数条件で取得

1つのIDならまだ普通にフィルターを書いても良いですが
例えば ID 1 3 5 7 9 の5つを取ってきたい場合。
方法は2つで、 find_one を5回繰り返すか、
複数条件のFilterを作るかになります。

これはSHOTGUNに限らず、Excelの処理にしてもSQLのクエリにしても
「アクセスしに行く」という挙動が最も負荷が高くなります。
SHOTGUNの場合それが露骨で、1回のfindないしはSHOTGUNにアクセスしにいく行為
そのものが尋常じゃないので、その数を極力減らさなければいけません。

なので、極力filterで条件を作り、1回のfindで取得するようにします。

複数のIDが欲しい場合は、こんな感じの関数にしました。

Any(いずれか)の条件の場合は、このような構造でフィルターを指定します。

<条件>

のところが、 [<field>, <relation>, <value(s)>] この構造の配列になります。
毎度書くの面倒なので、名前やID、ステータスなどなんかも
あらかじめBaseの所に書いておくと、色々と捗ります。

Entitiyにデータを登録する

新しくデータを登録したい場合は、

こんな感じで、登録したいEntityと、登録したいDATAを書きます。
DATAは、 Field:Value の形式で書きます。
こちらも、Project情報は入れるのとEntityならDict、MultDictならDictのListで指定します。

注意点としては、特にFieldの指定で「重複させない」ようにしていない限りは
同名のデータが量産されてしまうので、
登録してほしくない場合は、事前にチェックを入れます。

指定の名前があるかどうかチェック。
すでにある場合はTrueを返します。

そして作成。

引数で、登録するデータと、重複チェックをするかどうかを指定できるようにしておきます。
createの返り値で作成したEntity名とIDは返ってくるのですが、それだと
必要なフィールドがそろっていない状況になってしまうので
そのあとにgetしてます。
都合、createの場合はSHOTGUNをたたく回数が増えてしまった速度が遅くなってしまうのですが
致し方なし・・・せめてあるかどうかの確認ぐらいはなくしたいんですけどね…

こんな感じで拡張しつつ、長くなったので今回はここまで。
次はBatchな書き方?

SHOTGUNのAPIもそうだけど、それ以上にどうやってSHOTGUNを運用しているかのほうが
情報皆無なんだけど、こっちはさらに書きにくい・・・だからこそ情報ないんだろうなぁ・・・

コメントを残す

メールアドレスが公開されることはありません。

*