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 することが多いのですが、ちょっとした検証をするのに便利な方法が見つかってよかったですね。