「プログラム」カテゴリーアーカイブ

Google Cloud StorageにPythonでデータのやり取りをする

何をしたいかというと、GCS(Google Cloud Storage)にプログラムでデータを放り込んだり取り出したりしたい。

最初は、Blobstoreという物を使おうと思い調べていたけど、グーグルのマニュアルに、プログラムでBlobstoreへ書き込む機能はもうじきなくなるので、GCS(Google Cloud Storage)の方をおすすめする、みたいなことが書いてあったので、GCSの方を使うことにした。

使うのはpythonで、GCS(Google Cloud Storage)とやりとりするためには、Google Cloud Storage Python Client Libraryというのを使う必要があるらしく、まずはこのファイルをダウンロードしてインストール。インストールと言っても、、そのライブラリーのcloudstorageというフォルダがあれば、それをアプリと同じフォルダ(最初階層を間違えてエラーが出た)に置くだけで使えるようになった。

あとは、

import cloudstorage as gcs

でライブラリーを読み込んで、

g_file = gcs.open(filename,’w’,content_type=”,retry_params=write_retry_params)
g_file.write(testfile)
g_file.close()

とするだけでOKだった、予想以上に簡単。
filenameは固有のbucketの後は自分で好きに決めれてサブディレクトリみたいに、表面上は/a/b/c/catと整理しやすくできるみたい。
testfileに書き込む内容を入れる。
‘w’は書き込みモードで読み込むときはrにする。content_typeは自由に決めれることができるので書き込むファイルに合わせる。retry_paramsは良くわからないけど、書き込みに失敗した時に、どういう対応をするのか決めるっぽい。

次に、writeで書き込んで、closeで終わり。

書き込んだファイルを読み込む場合は、固有のbucketの後に、自分で決めたファイル名をつなげたURLにアクセスすると表示できる。
ブラウザで操作できるディベロッパーコンソールから書き込んだファイルの確認や削除、一般公開のON,OFFの設定や公開するときのURLの確認等もできた。

Google Cloud Storage Pythonを使ってみる

グーグルがやってるクラウドサービスというのを試しに使って見てるが、まだ良くわからないところが多い。

基本の単語からわからなくて、取り敢えず、データを収める場所がバケットで、収めるデータをオブジェクトというらしい。

面白いなと思ったのは、サブディレクトリの仕組みで
例えば、
animal/sea/fish
というサブディレクトリの構造らしきものがあったとして(これをバケットというらしい)、実際は、animalの下にseaフォルダがあって、そこにfishというファイルがあるんではなくて
たんに、fishというファイルにanimal/sea/fishという名前が付いているだけということらしい。

グーグルのクラウドサービスを見るとなんでも用意されてるので、ほんとできるだけ自前でやらずに用意されているものを上手に組み合わせてどう利用するかが大切だなぁと思った。

GAE(Google App Engine)pythonのNDBでデータの有る無しを確認してから取り出す。

GAEのデータストアNDBからデータを取り出す時にはまった。
日付データと、いくつかの文字列型のデータを収めるデータ型のクラスがあって、文字列は時々からの場合がある。
これをデータが空でないエンティティだけを取り出して、日付データでソートする、というのをやりたかったんだけど、どうしてもエラーが出てしまう。
どうも、このデータ型のクラスだけでは、希望のデータ取り出し方法はできないようで、結局、もう一つBooleanProperty型のプロパティを加えてあげることで解決した。

BooleanPropertyはTrueかFalseを収めることができる型で、データを入れるときにデータがあれば、BooleanPropertyをTrueにしておく。すると、取り出すときに、BooleanPropertyがTrueの物をフィルタリングすることで、あっけなく希望通りのデータ取り出しが出来た。

GAE(Google App Engine)pythonのNDBで特定のデータを消す方法

最近、GAEのNDBをいじっていて、わからないことが次々に出てくるんだけど、ネットでいろいろ調べていると、stackoverflowって海外のサイトと、公式のドキュメント、この2つが圧倒的に役に立つ。たまに英語のニュアンスがわからないくて、日本語のみで検索することがあるけど、情報量が違いすぎて、英語ネイティブとの差は大きいなと感じる。

で、特定のデータを消す方法だけど、NDBでは消したいデータのキーを取り出してから消去する、らしくて
X.key.delete()
みたいに書くらしい。

特定の条件に当てはまるデータを消したい場合は、delete_multiを使うといいらしくて

q1 = A.query()
q2 = q1.filter( >=を使ったフィルター ) # Filter
q3 = q2.filter( <=を使ったフィルター ) # Filter ndb.delete_multi(q3.fetch(keys_only=True)) みたいにしたら簡単に消したいデータだけ消すことができた。 keys_only=True というのは、fetchのオプションで、keys_only=Trueとすると、データ(エンティティ)を返すんではなくて、キーのみを返すらしい。 削除に必要なのはキーだけなので、あとは簡単にndb.delete_multiで一発で消去できる。

GAE(Google app engine python)でデプロイに失敗しError 409が出た時の解決法

以前もデプロイに失敗して以下のようなエラーが出たことがある。

Error 409: — begin server output —
Another transaction by user (ユーザー名) is already in progress for app: (アプリ名), version: 1. That user can undo the transaction with “appcfg rollback”.

これはデプロイの途中で何かあってエラーが出たという意味らしく、元の状態に戻すためにはコマンドプロンプトからコマンドを打ち込む必要がある。

前回は、ネットで調べてすぐ解決したんだけど、今回はなぜか何度やっても解決しない。原因は、Google app engineを置いている場所と、アプリを置いているフォルダを別の場所においていたからっぽい。

結論を書くと以下のようにしたら解決した。

まず、google_appengineのフォルダ上にマウスポインタを置いて、SHIFTを押しながら右クリック

すると開いたウィンドウ内に「コマンド ウィンドウをココで開く」があるのでクリック。

すると、GAE(Google app engine python)までのパスがすでに表示された状態でコマンドプロンプトが開くので

「python appcfg.py rollback ここにアプリのパスを書く」をコピペしてエンターを押せばOK

アプリのパスは、アプリのフォルダ内を表示させている状態で、フォルダ上部にあるパンくずリスト上で右クリックしてアドレスをコピーで取得できる。

また次回エラーが出た時に時間を無駄にしないように半分自分のためにここにメモしておく。