Postgresデータベース(9.3)があり、Resources
というテーブルがあるとします。 Resources
テーブルには、フィールドid
(int)とdata
(JSONタイプ)があります。
上記の表に次のレコードがあるとします。
私がやりたいのは、データ列に「Doe」に等しい姓を持つjson要素があるすべてのレコードを返すクエリを作成することです
私はこのようなものを書き込もうとしました:
records = db_session.query(Resource).filter(Resources.data->>'lastname' == "Doe").all()
しかし、Pycharmは「->>」でコンパイルエラーを発生させます
誰も私が必要なことを行うためにフィルター句をどのように書くか知っていますか?
astext を使用してみてください
records = db_session.query(Resource).filter(
Resources.data["lastname"].astext == "Doe"
).all()
列のタイプはJSONBでなければならないことに注意してください。通常のJSON列は機能しません。
また、文字列を明示的に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()
sqlalchemy.types.JSON に従って、このようにできます
from sqlalchemy import JSON
from sqlalchemy import cast
records = db_session.query(Resource).filter(Resources.data["lastname"] == cast("Doe", JSON)).all()