ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ 4]c@@sddlmZddlmZddlmZddlmZddlmZddl m Z dZ e j e j Ze jd d ed edeZe jdd ed edeZe jdd ed edeZe jdd ed edeZe jdd ed edeZe jdd ed edeZe jdd ed edeZdejjfdYZeeejj>t precedencetnatural_self_precedentteager_groupings#>>t?s?&s?|s@>s<@t JSONPathTypecB@seZdZdZRS(c@s"|j|fd}|S(Nc@sit|tjjstg|D]}tj|^q"}ddj|}re|}n|S(Ns{%s}s, (t isinstanceRtcollections_abctSequencetAssertionErrort text_typetjoin(tvaluetelemttokens(t super_proc(sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pytprocessKs "(tstring_bind_processor(tselftdialectR((RsV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pytbind_processorHsc@s"|j|fd}|S(Nc@sit|tjjstg|D]}tj|^q"}ddj|}re|}n|S(Ns{%s}s, (R RRRRRR(RRR(R(sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pyRXs "(tstring_literal_processor(RRR((RsV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pytliteral_processorUs(t__name__t __module__RR(((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pyR Gs cB@sKeZdZejZeddZdej j fdYZ e Z RS(s Represent the PostgreSQL JSON type. This type is a specialization of the Core-level :class:`.types.JSON` type. Be sure to read the documentation for :class:`.types.JSON` for important tips regarding treatment of NULL values and ORM use. .. versionchanged:: 1.1 :class:`.postgresql.JSON` is now a PostgreSQL- specific specialization of the new :class:`.types.JSON` type. The operators provided by the PostgreSQL version of :class:`.JSON` include: * Index operations (the ``->`` operator):: data_table.c.data['some key'] data_table.c.data[5] * Index operations returning text (the ``->>`` operator):: data_table.c.data['some key'].astext == 'some value' * Index operations with CAST (equivalent to ``CAST(col ->> ['some key'] AS )``):: data_table.c.data['some key'].astext.cast(Integer) == 5 * Path index operations (the ``#>`` operator):: data_table.c.data[('key_1', 'key_2', 5, ..., 'key_n')] * Path index operations returning text (the ``#>>`` operator):: data_table.c.data[('key_1', 'key_2', 5, ..., 'key_n')].astext == 'some value' .. versionchanged:: 1.1 The :meth:`.ColumnElement.cast` operator on JSON objects now requires that the :attr:`.JSON.Comparator.astext` modifier be called explicitly, if the cast works only from a textual string. Index operations return an expression object whose type defaults to :class:`.JSON` by default, so that further JSON-oriented instructions may be called upon the result type. Custom serializers and deserializers are specified at the dialect level, that is using :func:`.create_engine`. The reason for this is that when using psycopg2, the DBAPI only allows serializers at the per-cursor or per-connection level. E.g.:: engine = create_engine("postgresql://scott:tiger@localhost/test", json_serializer=my_serialize_fn, json_deserializer=my_deserialize_fn ) When using the psycopg2 dialect, the json_deserializer is registered against the database using ``psycopg2.extras.register_default_json``. .. seealso:: :class:`.types.JSON` - Core level JSON type :class:`.JSONB` cC@s5tt|jd||dk r1||_ndS(s Construct a :class:`.JSON` type. :param none_as_null: if True, persist the value ``None`` as a SQL NULL value, not the JSON encoding of ``null``. Note that when this flag is False, the :func:`.null` construct can still be used to persist a NULL value:: from sqlalchemy import null conn.execute(table.insert(), data=null()) .. versionchanged:: 0.9.8 - Added ``none_as_null``, and :func:`.null` is now supported in order to persist a NULL value. .. seealso:: :attr:`.JSON.NULL` :param astext_type: the type to use for the :attr:`.JSON.Comparator.astext` accessor on indexed attributes. Defaults to :class:`.types.Text`. .. versionadded:: 1.1 t none_as_nullN(tsuperRt__init__tNonet astext_type(RR R$((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pyR"s t ComparatorcB@seZdZedZRS(s0Define comparison operations for :class:`.JSON`.cC@srt|jjjtjjrF|jjjt |jjd|jj S|jjjt |jjd|jj SdS(s On an indexed expression, use the "astext" (e.g. "->>") conversion when rendered in SQL. E.g.:: select([data_table.c.data['some key'].astext]) .. seealso:: :meth:`.ColumnElement.cast` t result_typeN( R texprtrightttypetsqltypesRR tlefttoperatetJSONPATH_ASTEXTR$tASTEXT(R((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pytastexts    (RRt__doc__tpropertyR/(((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pyR%sN( RRR0R*tTextR$tFalseR#R"RR%tcomparator_factory(((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pyRfs A tjsoncB@s3eZdZdZdejfdYZeZRS(s_Represent the PostgreSQL JSONB type. The :class:`.JSONB` type stores arbitrary JSONB format data, e.g.:: data_table = Table('data_table', metadata, Column('id', Integer, primary_key=True), Column('data', JSONB) ) with engine.connect() as conn: conn.execute( data_table.insert(), data = {"key1": "value1", "key2": "value2"} ) The :class:`.JSONB` type includes all operations provided by :class:`.JSON`, including the same behaviors for indexing operations. It also adds additional operators specific to JSONB, including :meth:`.JSONB.Comparator.has_key`, :meth:`.JSONB.Comparator.has_all`, :meth:`.JSONB.Comparator.has_any`, :meth:`.JSONB.Comparator.contains`, and :meth:`.JSONB.Comparator.contained_by`. Like the :class:`.JSON` type, the :class:`.JSONB` type does not detect in-place changes when used with the ORM, unless the :mod:`sqlalchemy.ext.mutable` extension is used. Custom serializers and deserializers are shared with the :class:`.JSON` class, using the ``json_serializer`` and ``json_deserializer`` keyword arguments. These must be specified at the dialect level using :func:`.create_engine`. When using psycopg2, the serializers are associated with the jsonb type using ``psycopg2.extras.register_default_jsonb`` on a per-connection basis, in the same way that ``psycopg2.extras.register_default_json`` is used to register these handlers with the json type. .. versionadded:: 0.9.7 .. seealso:: :class:`.JSON` RR%cB@s;eZdZdZdZdZdZdZRS(s0Define comparison operations for :class:`.JSON`.cC@s|jt|dtjS(svBoolean expression. Test for presence of a key. Note that the key may be a SQLA expression. R&(R,tHAS_KEYR*tBoolean(Rtother((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pythas_keyscC@s|jt|dtjS(sHBoolean expression. Test for presence of all keys in jsonb R&(R,tHAS_ALLR*R7(RR8((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pythas_all#scC@s|jt|dtjS(sGBoolean expression. Test for presence of any key in jsonb R&(R,tHAS_ANYR*R7(RR8((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pythas_any(scK@s|jt|dtjS(sBoolean expression. Test if keys (or array) are a superset of/contained the keys of the argument jsonb expression. R&(R,tCONTAINSR*R7(RR8tkwargs((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pytcontains-scC@s|jt|dtjS(s|Boolean expression. Test if keys are a proper subset of the keys of the argument jsonb expression. R&(R,t CONTAINED_BYR*R7(RR8((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pyt contained_by3s(RRR0R9R;R=R@RB(((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pyR%s     (RRR0t__visit_name__RR%R4(((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pyRs*!tjsonbN(RR(t __future__RtbaseRRtRR*RtsqlRt__all__t _PRECEDENCEtjson_getitem_optidx_precedencet custom_optTrueR.R-R6R:R<R>RARR R(((sV/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/postgresql/json.pytsb         R