Redash のモデルが持っているメソッドを Python コンソールから呼んでみたい
Redash のとあるモデルのメソッドを呼び出してみたとき、どんな結果が返ってくるか気になる時がありますよね。
そんなときは Python コンソールで確認してみましょう。
検証に使った Redash のバージョンは v8.0.0。Docker Based Developer Installation Guide の手順にしたがって環境構築しました。
やってみた
➜ redash git:(a16f551e2) ✗ docker-compose exec server bash redash@19df75427d3a:/app$ python Python 2.7.16 (default, Aug 14 2019, 13:44:33) [GCC 8.3.0] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from redash.app import create_app >>> from redash.models import Query >>> app = create_app() >>> app.app_context().push() >>> [row for row in Query.all_queries(group_ids=[2], include_drafts=True)] [Query(id=1, name=u'New Query', query_hash=u'd7d1d45bcb946547b382bb0e7853c185', version=1, user_id=1, org_id=1, data_source_id=1, query_hash=u'd7d1d45bcb946547b382bb0e7853c185', last_modified_by_id=1, is_archived=False, is_draft=True, schedule=None, schedule_failures=0)]
便利ですね!これは調査が捗ります。
はまりどころ
postgres に接続できない。
v8.0.0 をチェックアウトして docker-compose run --rm server create_db
したところ、以下のようなエラーがでていました。
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "postgres" to address: Name or service not known (Background on this error at: http://sqlalche.me/e/e3q8)
postgres サービスのログをみると、今度は以下のようなログが出ていました。
postgres_1 | Error: Database is uninitialized and superuser password is not specified. postgres_1 | You must specify POSTGRES_PASSWORD to a non-empty value for the postgres_1 | superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run". postgres_1 | postgres_1 | You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all postgres_1 | connections without a password. This is *not* recommended. postgres_1 | postgres_1 | See PostgreSQL documentation about "trust": postgres_1 | https://www.postgresql.org/docs/current/auth-trust.html
どこかのタイミングで認証方法が変わったのでしょうか。とりあえず開発環境としては環境変数に POSTGRES_HOST_AUTH_METHOD=trust
と書いておけば良いようです。Redash の master でもその方法で対応されていました。
モデルのメソッドを呼ぼうとするとエラーがでる
最初に検証しようとしたコードは以下のようなものでした。
from redash.models import Query [row for row in Query.all_queries(group_ids=[2], include_drafts=True)]
しかし、これを実行してもエラーが発生します。
RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.
このエラーについては、丁寧に参照すべきドキュメントの URL が記載されているので確認してみると、Flask アプリケーションを初期化し、app.app_context().push()
することでエラーが解消できるようでした。
感想
がっつり調査をするときは PyCharm を使って Debug することが多いのですが、ちょっとした検証をするのに便利な方法が見つかってよかったですね。