U SW4 @sdZddlZddlTddlmZddlmZddlmZddlmZddlmZdd lmZdd lm Z dd lm Z dd lm Z dd lm Z zddl mZeWnek rYnXddlmZddlmZddlmZddlmZzddlmZWndZYnXejddddZGdddeZGdddeZGdddeZGdddeZGd d!d!eZGd"d#d#eZ d$d%Z!ee e!Gd&d'd'eZ"Gd(d)d)e"e#Z$Gd*d+d+e%Z&Gd,d-d-e"e#Z'Gd.d/d/e#Z(Gd0d1d1e"e(Z)Gd2d3d3e"e*Z+d4d5Z,ej-d6d7d8d9d:d;dd?d@dAdBdCdDdEGdFdGdGe Z.GdHdIdIe/Z0GdJdKdKe Z1e02dLdMdNdOdPdQe03ej4dRej5dSej6dTej7dUej8dVej9dWej:dRej;dXejdZej?dUej@dSejAdTejBdDid[d\ZCdad_d`ZDdS)bzr Collection of postgres-specific extensions, currently including: * Support for hstore, a key/value type storage N)*) Expression)logger)Node)OP)Param) Passthrough) returns_clone) QueryCompiler) SelectQuery) UUIDField)compat)adapt)AsIs)register_adapter)register_hstore)JsonF)clonecCst|tjt|SN)rrCASTSQLselfZas_typer/postgres_ext.pycast#srcs,eZdZfddZddZddZZS) _LookupNodecs||_||_tt|dSr)nodepartssuperr__init__)rrr __class__rrr (sz_LookupNode.__init__cCst||jt|jSr)typerlistrrrrr clone_base-sz_LookupNode.clone_basecCstt|ddtjt|S)NT)Zparens)rClauserrrrrrrr0sz_LookupNode.cast)__name__ __module__ __qualname__r r&r __classcell__rrr!rr's rcsLeZdZdfdd ZddZedddZd d Zd d Zd dZ Z S)_JsonLookupBaseFcstt|||||_dSr)rr,r _as_json)rrras_jsonr!rrr 4sz_JsonLookupBase.__init__cCst||jt|j|jSr)r#rr$rr-r%rrrr&8sz_JsonLookupBase.clone_baseTcCs ||_dSr)r-)rr.rrrr.;sz_JsonLookupBase.as_jsoncCs8|d}t|ttfr*t|tjt|St|tj|SNT) r. isinstancer$dictrrJSONB_CONTAINSr JSONB_EXISTS)rotherrrrrcontains?s z_JsonLookupBase.containscGst|dtjtt|Sr/)rr.rJSONB_CONTAINS_ANY_KEYrr$rkeysrrr contains_anyEs  z_JsonLookupBase.contains_anycGst|dtjtt|Sr/)rr.rJSONB_CONTAINS_ALL_KEYSrr$r7rrr contains_allKs  z_JsonLookupBase.contains_all)F)T) r(r)r*r r&r r.r5r9r;r+rrr!rr,3s r,c@seZdZdZddZdS) JsonLookup json_lookupcCst|j|j|g|jSr)r<rrr-rvaluerrr __getitem__TszJsonLookup.__getitem__N)r(r)r* _node_typer@rrrrr<Qsr<c@seZdZdZdS)JsonPath json_pathN)r(r)r*rArrrrrBWsrBc@s$eZdZdZeddZddZdS) ObjectSlice object_slicecCsLt|tr |jpd|jpdg}n"t|tr2|g}ntt|d}|||S)Nr:)r0slicestartstopintmapsplit)clsrr?rrrrcreate]s   zObjectSlice.createcCs t||SrrDrNr>rrrr@gszObjectSlice.__getitem__N)r(r)r*rA classmethodrNr@rrrrrDZs rDc@seZdZddZdS)_ArraycCs||_||_dSr)fielditems)rrRrSrrrr ksz_Array.__init__N)r(r)r*r rrrrrQjsrQcCsD|jjjj}t|j}||td||j d|jj fS)Nz%s::%s%s[]) rR model_classZ_metadatabaseget_connrrSZpreparerZget_column_type dimensions)ZarrconnrSrrr adapt_arrayos   rZcs"eZdZdZdfdd ZZS)IndexedFieldMixinZGiSTNcs<|ddtt|j|||jr2|p,|j|_nd|_dS)NindexT) setdefaultrr[r r\default_index_type index_type)rr_argskwargsr!rrr }s  zIndexedFieldMixin.__init__)N)r(r)r*r^r r+rrr!rr[zsr[csNeZdZdZedffdd ZddZddZd d Zd d Z d dZ Z S) ArrayFieldGINcs4||||_||_|j|_tt|j||dSr)_ArrayField__fieldrXZ get_db_fielddb_fieldrrbr )rZ field_classrXr`rar!rrr s  zArrayField.__init__cCs$|j|}|jd|j7_|S)NrT)re__ddl_column__r?rX)rZ column_typesqlrrrrgs zArrayField.__ddl_column__cCs,|dkr dSt|ttfs"t|}t||Sr)r0r$rQr>rrrdb_values zArrayField.db_valuecCs t||SrrOr>rrrr@szArrayField.__getitem__cGst|tjt|Sr)rr ACONTAINSrrrSrrrr5szArrayField.containscGst|tjt|Sr)rr ACONTAINS_ANYrrkrrrr9szArrayField.contains_any) r(r)r*r^Z IntegerFieldr rgrir@r5r9r+rrr!rrbsrbc@seZdZdZdS)DateTimeTZField datetime_tzN)r(r)r*rfrrrrrmsrmc@sheZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZdS) HStoreFieldhashcCst|tjt|Sr)rrHKEYrrkeyrrrr@szHStoreField.__getitem__cCs t|Sr)fnZakeysr%rrrr8szHStoreField.keyscCs t|Sr)rtZavalsr%rrrvaluesszHStoreField.valuescCs t|Sr)rtZhstore_to_matrixr%rrrrSszHStoreField.itemscGst|tt|Sr)rtrGrr$)rr`rrrrGszHStoreField.slicecCs t||Sr)rtZexistrrrrrexistsszHStoreField.existscCs t||Sr)rtdefinedrrrrrrwszHStoreField.definedcKst|tj|Sr)rrHUPDATE)rdatarrrupdateszHStoreField.updatecGst|tt|Sr)rtdeleterr$r7rrrr{szHStoreField.deletecCsJt|trt|tjt|St|ttfrrrrr5s  zHStoreField.containscGst|tjtt|Sr)rrHCONTAINS_ANY_KEYrr$r7rrrr9szHStoreField.contains_anyN)r(r)r*rfr@r8rurSrGrvrwrzr{r5r9rrrrrosrocs:eZdZdZd fdd ZddZddZd d ZZS) JSONFieldjsonNcs,tdkrtd||_tt|j||dS)Nz/Your version of psycopg2 does not support JSON.)r Exceptiondumpsrrr )rrr`rar!rrr szJSONField.__init__cCs(|dkr |St|ts$t||jdS|S)N)r)r0rrr>rrrris  zJSONField.db_valuecCs t||gSr)r<r>rrrr@szJSONField.__getitem__cGs t||Sr)rBr7rrrpathszJSONField.path)N) r(r)r*rfr rir@rr+rrr!rrs rc@s4eZdZdZdZddZddZddZd d Zd S) BinaryJSONFieldjsonbrccCs2t|ttfr t|tjt|St|tjt|Sr) r0r$r1rrr2rr3rrr4rrrr5szBinaryJSONField.containscCst|tjt|Sr)rrJSONB_CONTAINED_BYrrrrr contained_byszBinaryJSONField.contained_bycGst|tjtt|Sr)rrr6rr$rkrrrr9s  zBinaryJSONField.contains_anycGst|tjtt|Sr)rrr:rr$rkrrrr;s  zBinaryJSONField.contains_allN) r(r)r*rfr^r5rr9r;rrrrrs rc@seZdZdZdZddZdS) TSVectorFieldtsvectorrccCst|tjt|Sr)rrTS_MATCHrt to_tsquery)rqueryrrrmatchszTSVectorField.matchN)r(r)r*rfr^rrrrrrsrcCstt|tjt|Sr)rrtZ to_tsvectorrrr)rRrrrrMatch srrszH@>zH?&zH?zH?|zH||zA@>zA||zT@@zJB@>zJB<@zJB?|zJB?&zJB?z::)rqrxr|r~rrrjrlrr2rr6r:r3rcsBeZdZd fdd ZddZddZdd Zfd d ZZS) PostgresqlExtCompilerFcsPtt||||}d}|D]}t|tr|j}q|rL|jdtd||S)NzUSING %s) rr _create_indexr0r[r_Znodesinsertr)rrUZfieldsuniqueZclauser_rRr!rrr$s  z#PostgresqlExtCompiler._create_indexcCs>||j||\}}dd|jD}d|d|f}||fS)NcSsg|]}t|dqS)rd)str).0partrrr 4sz=PostgresqlExtCompiler._parse_object_slice..z%s[%s]rF) parse_noderrjoin)rr alias_mapconvrhparamsrrrr_parse_object_slice1sz)PostgresqlExtCompiler._parse_object_slicec Cs||j||\}}|g}|jD]*}||||\}} |||| q |jr^d|}n*|dd|d} } dd| | f}||fS)N->rz->>)rrrappendextendr-r) rrrrrhrZlookupsrZpart_sqlZ part_paramsheadtailrrr_parse_json_lookup8s    z(PostgresqlExtCompiler._parse_json_lookupcCsT||j||\}}|jr d}nd}|ddtt|j|||jf|fS)Nz#>z#>>z{%s},) rrr-rrrKrrZ interpolation)rrrrrhrZoperandrrr_parse_json_pathJs z&PostgresqlExtCompiler._parse_json_pathcs(tt|}|j|j|j|jd|S)N)rEr=rC)rr get_parse_maprzrrr)rZ parse_mapr!rrrSsz#PostgresqlExtCompiler.get_parse_map)F) r(r)r*rrrrrr+rrr!rr#s   rcs@eZdZeZfddZd ddZd dd Zfd d ZZ S)PostgresqlExtDatabasecs2|dd|_|dd|_tt|j||dS)Nserver_side_cursorsFrT)poprrrrr )rr`rar!rrr _szPostgresqlExtDatabase.__init__NcCs |r|j|dS|S)Nname)rWcursor)rrrrr get_cursordsz PostgresqlExtDatabase.get_cursorTFc Cst||f|p$|jo$|d}||rN|jtt d}d}n|}z| ||pddWn:t k r}z| r|j r|W5d}~XYnX|r| r|W5QRX|S)NZselectrFr)rdebugrlower startswithZexception_wrapperrruuidZuuid1executerZget_autocommitZ autorollbackZrollbackZcommit)rrhrrequire_commit named_cursorZuse_named_cursorrexcrrr execute_sqlis&   z!PostgresqlExtDatabase.execute_sqlc s*tt|j|f|}|jr&t|dd|S)NT)Zglobally)rr_connectr)rrVrarYr!rrrs zPostgresqlExtDatabase._connect)N)NTF) r(r)r*rZcompiler_classr rrrr+rrr!rr\s   rc@s eZdZeddZddZdS)ServerSideSelectQuerycCst|j}||Sr)rrUZ_clone_attributes)rMrrrrrclone_from_querys z&ServerSideSelectQuery.clone_from_querycCs |\}}|jj||dddS)NFT)rr)rhrVr)rrhrrrr_executes zServerSideSelectQuery._executeN)r(r)r*rPrrrrrrrs rztimestamp with time zoneZhstorerrr)rnrprrrz@>z?&?z?|rz||z&&z@@z<@c csFt|}|j(|}||_|D] }|Vq,W5QRXdSr)rrrVZ transactionrZ_qriterator)Z select_queryrZ query_resultobjrrr ServerSides    rLEFTTcCst|td||td|S)Nz%s JOIN LATERALzON %s)r'r)ZlhsZrhsZ join_typeZ conditionrrr LateralJoins  r)rT)E__doc__rZpeeweerrrrrrr r r r Z psycopg2cffir register ImportErrorZpsycopg2.extensionsrrrZpsycopg2.extrasrrrrrr,r<rBrDobjectrQrZr[ZFieldrbZ DateTimeFieldrmrorrZ TextFieldrrrzrZPostgresqlDatabaserrZregister_fieldsZ register_opsr|r~rrrqrxrjrlrr2rr6r:r3rrrrrrrs                       )9+