L iddlmZGddejZGddZGddeejj ZGdd eejj Zy ) )typesceZdZdZy)JSONa MSSQL JSON type. MSSQL supports JSON-formatted data as of SQL Server 2016. The :class:`_mssql.JSON` datatype at the DDL level will represent the datatype as ``NVARCHAR(max)``, but provides for JSON-level comparison functions as well as Python coercion behavior. :class:`_mssql.JSON` is used automatically whenever the base :class:`_types.JSON` datatype is used against a SQL Server backend. .. seealso:: :class:`_types.JSON` - main documentation for the generic cross-platform JSON datatype. The :class:`_mssql.JSON` type supports persistence of JSON values as well as the core index operations provided by :class:`_types.JSON` datatype, by adapting the operations to render the ``JSON_VALUE`` or ``JSON_QUERY`` functions at the database level. The SQL Server :class:`_mssql.JSON` type necessarily makes use of the ``JSON_QUERY`` and ``JSON_VALUE`` functions when querying for elements of a JSON object. These two functions have a major restriction in that they are **mutually exclusive** based on the type of object to be returned. The ``JSON_QUERY`` function **only** returns a JSON dictionary or list, but not an individual string, numeric, or boolean element; the ``JSON_VALUE`` function **only** returns an individual string, numeric, or boolean element. **both functions either return NULL or raise an error if they are not used against the correct expected value**. To handle this awkward requirement, indexed access rules are as follows: 1. When extracting a sub element from a JSON that is itself a JSON dictionary or list, the :meth:`_types.JSON.Comparator.as_json` accessor should be used:: stmt = select(data_table.c.data["some key"].as_json()).where( data_table.c.data["some key"].as_json() == {"sub": "structure"} ) 2. When extracting a sub element from a JSON that is a plain boolean, string, integer, or float, use the appropriate method among :meth:`_types.JSON.Comparator.as_boolean`, :meth:`_types.JSON.Comparator.as_string`, :meth:`_types.JSON.Comparator.as_integer`, :meth:`_types.JSON.Comparator.as_float`:: stmt = select(data_table.c.data["some key"].as_string()).where( data_table.c.data["some key"].as_string() == "some string" ) .. versionadded:: 1.4 N)__name__ __module__ __qualname____doc__d/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/json.pyrrs7r rceZdZdZdZdZy)_FormatTypeMixinctN)NotImplementedErrorselfvalues r _format_valuez_FormatTypeMixin._format_valueUs !##r c8j|fd}|S)Nc>j|}r|}|Srrrr super_procs r processz0_FormatTypeMixin.bind_processor..process[%&&u-E"5)Lr )string_bind_processorrdialectrrs` @r bind_processorz_FormatTypeMixin.bind_processorXs//8   r c8j|fd}|S)Nc>j|}r|}|Srrrs r rz3_FormatTypeMixin.literal_processor..processfrr )string_literal_processorrs` @r literal_processorz"_FormatTypeMixin.literal_processorcs227;   r N)rrrrr r$r r r rrTs$  r rceZdZdZy) JSONIndexTypec>t|trd|z}|Sd|z}|S)Nz$[%s]z$."%s") isinstanceintrs r rzJSONIndexType._format_valueps- eS !eOE u$E r Nrrrrr r r r&r&osr r&ceZdZdZy) JSONPathTypec ddj|Dcgc]}t|trd|znd|zc}zScc}w)Nz$%sz[%s]z."%s")joinr(r))rrelems r rzJSONPathType._format_valueysN GG!&&0c%:FTM$N   s!; Nr*r r r r,r,xs r r,N)r.rsqltypesrrr&r,r r r r2sW"88==8B6$hmm&A&A  #X]]%?%?  r