web-dev-qa-db-ja.com

Python SQLAlchemyおよびPostgres-JSON要素を照会する方法

Postgresデータベース(9.3)があり、Resourcesというテーブルがあるとします。 Resourcesテーブルには、フィールドid(int)とdata(JSONタイプ)があります。

上記の表に次のレコードがあるとします。

  • 1、{'firstname': 'Dave'、 'lastname': 'Gallant'}
  • 2、{'firstname': 'John'、 'lastname': 'Doe'}

私がやりたいのは、データ列に「Doe」に等しい姓を持つjson要素があるすべてのレコードを返すクエリを作成することです

私はこのようなものを書き込もうとしました:

records = db_session.query(Resource).filter(Resources.data->>'lastname' == "Doe").all()

しかし、Pycharmは「->>」でコンパイルエラーを発生させます

誰も私が必要なことを行うためにフィルター句をどのように書くか知っていますか?

22
Dave Gallant

astext を使用してみてください

records = db_session.query(Resource).filter(
              Resources.data["lastname"].astext == "Doe"
          ).all()

列のタイプはJSONBでなければならないことに注意してください。通常のJSON列は機能しません。

42
Anzel

また、文字列を明示的にJSONにキャストできます( Postgres JSONタイプdoc を参照)。

from sqlalchemy.dialects.postgres import JSON
from sqlalchemy.sql.expression import cast
db_session.query(Resource).filter(
    Resources.data["lastname"] == cast("Doe", JSON)
).all()
8
kc41

sqlalchemy.types.JSON に従って、このようにできます

from sqlalchemy import JSON
from sqlalchemy import cast
records = db_session.query(Resource).filter(Resources.data["lastname"] == cast("Doe", JSON)).all()
0
user1900344