U SW3@s ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddl mZddlmZddlmZzddlmZWnek reZYnXddlmZddlmZdd lmZd Zd d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dlmZWn(ek rGd?d@d@ejZYnXe dAZ!e!"edBZ#e$fdCdDZ%ej&ddEkZ'ej&ddFkZ(ej&ddEdGkZ)e(r@ddl*Z*ddHlm+Z+ddIlm,Z,dJdKZ-e.Z/e0Z1e.Z2e3e*dLZ4dMdKZ5e6Z7d]dNdOZ8n,e'rde9Z/e2Z1e:Z5dPdQZ4e;dRnendVdKZ>zddWl?m@ZAWnek rdZAYnXz ddlBZBWnek reAZBYnXeAreAjCeBjCkreAZBzddXlDmEZEeEFWnek r"YnXzddlGZGddYlGmHZIWnek rVdZGYnXz ddlJZKWn>ek rz ddlLZKWnek rdZKYnXYnXz(ddZlMmNZNdd[lMmOZOdd\lMmPZPWn2ek rd^d]d^ZNd_d`ZOdadbZPYnXz4ddclMmQZQdddlMmRZRddelMmSZSddflMmTZTWn&ek rZdZQZRZSZTYnXeBreBUejVe.eBUejWe.eBUej e.dgdhdidjdkdlgZXeYeXZZdmZ[dndoZ\dpdqdrdsdtdudvZ]e]Z^dwe^dk<dxe^dl<dydzZ_d{d|Z`Gd}d~d~eZaeaddddddddddddddddddddddddddZbeadddddZcecjdZeecjfZgecjhZidZjdEZkdFZldZmdZnebjoebjpebjqebjrebjsebjtebjuebjvebjwebjxebjyd ZzddZ{ddZ|ddZ}Gdd3d3e$Z~Gddde$ZGddde$ZGddde$ZGdd7d7eZeZGdddeZGdddeZedZGdddeZGdd.d.eZGdddeZGdddeZGdddeZGdddeZGdd=d=eZddZGdddeZGdddeZeddÃZGddńdeddǃZGddɄde$ZGdddeZGdd d eZGdd"d"eZGdd d eZGdd5d5eZGdd1d1eZGddфdeZGdddeZGdddeZGdddeZd_ddׄZGdddeZGdddeZGdd8d8eZGdd d eZGdd<dd>e܃ZGd?d@d@e܃ZGdAdBdBeZGdCdDdDeZGdEdFdFe$ZeSdk rGdGdHdHe$ZSGdIddeɃZeB reِdJZndZGdKdLdLe$ZGdMdNdNeZGdOd*d*e%eZdPdQZdRdSZedTdUZGdVdWdWeZdXd0ZdYdZZd[d\ZdS(`N) bisect_left) bisect_right)deque) namedtuple) OrderedDict)deepcopywraps)isclassz2.8.4 BareFieldBigIntegerField BlobField BooleanField CharFieldCheckClause CompositeKey DatabaseError DataError DateField DateTimeField DecimalFieldDeferredRelation DoesNotExist DoubleFieldDQFieldFixedCharField FloatFieldfnForeignKeyFieldImproperlyConfigured IntegerFieldIntegrityErrorInterfaceError InternalErrorJOIN JOIN_FULL JOIN_INNERJOIN_LEFT_OUTERModel MySQLDatabaseNotSupportedErrorOperationalErrorParamPostgresqlDatabaseprefetchPrimaryKeyFieldProgrammingErrorProxyRSmallIntegerFieldSqliteDatabaseSQL TextField TimeFieldTimestampFieldUsing UUIDFieldWindow) NullHandlerc@seZdZddZdS)r>cCsdSN)selfrecordr@r@9/opt/alt/python38/lib64/python3.8/site-packages/peewee.pyemitiszNullHandler.emitN)__name__ __module__ __qualname__rDr@r@r@rCr>hsr>peewee_metaclass_helper_cCs|t|fiSr?) _METACLASS_)metabaser@r@rCwith_metaclassssrM)rN)Callable)reducecCs t|tSr?) isinstancerQ)cr@r@rC}rUprintcCst|dSNraw_unicode_escape)bytesencodesr@r@rCrUrVcCs|j|k r|||dSr?) __traceback__with_traceback)tpvaluetbr@r@rCreraises  rccCstj|tjddS)N )sysstdoutwriter\r@r@rCprint_s rhz4def reraise(tp, value, tb=None): raise tp, value, tbzUnsupported python version.@BcCs&|jd|j|jddttS)Ngi) microsecondssecondsdays_Mtr@r@rCrUrVcCs|Sr?) total_secondsror@r@rCrUrV)dbapi2)compat) extensions)format_date_time)sort_models_topologically) strip_parensc CsH|p dd}|D]2}z|tj||WStk r@YqXq|S)NcSs|Sr?r@xr@r@rCrUrVz"format_date_time..)datetimestrptime ValueError)raformats post_processfmtr@r@rCrus rucsTttgfdddd}t|ddD] }|q:ttS)z@Sort models topologically so that parents will precede children.csD|kr@|kr@||jjD]}|jq&|dSr?)add_meta reverse_relvalues model_classappend)model foreign_keydfsmodelsorderingseenr@rCrs   z&sort_models_topologically..dfscSs|jj|jjfSr?)rnamedb_table)mr@r@rCrUrVz+sort_models_topologically..T)keyreverse)setsortedlistreversed)rnamesrr@rrCrvs rvcCs|r|ddkr|Sd}}t|}||krf||dkrf||ddkrf|d7}|d7}|d8}q$qfq$|rd}d}t|||D]N}||dkr|d7}n||dkr|d8}|dkr|d7}d}||krqq||8}|dkr||| S|S)Nr())lenrange)r]ctil unbalanced_ctrequiredr@r@rCrws6    rw)_DictQueryResultWrapper)_ModelQueryResultWrapper)_SortedFieldList)_TuplesQueryResultWrapperyearmonthdayhourminutesecond)%Y-%m-%d %H:%M:%S%Y-%m-%d %H:%M:%S.%f%Y-%m-%d%H:%M:%S %H:%M:%S.%f%H:%McCs(|tks t|sdSt|t}t||Sr?)DATETIME_LOOKUPSAssertionErrorruSQLITE_DATETIME_FORMATSgetattr lookup_typedatetime_stringdtr@r@rC_sqlite_date_parts   rz%Yz%Y-%mrz %Y-%m-%d %Hz%Y-%m-%d %H:%Mr)rrrrrrz%Y-%m-%d %H:%iz%Y-%m-%d %H:%i:%ScCs,|tks t|sdSt|t}|t|Sr?)SQLITE_DATE_TRUNC_MAPPINGrrurstrftimerr@r@rC_sqlite_date_trunc&s   rcCst||tjdk Sr?)researchI)regexrar@r@rC_sqlite_regexp-src@seZdZddZdS)attrdictcCs||Sr?r@rAattrr@r@rC __getattr__1szattrdict.__getattr__N)rErFrGrr@r@r@rCr0srandor+-*/&|^%=<<=>>=!=inznot iniszis notlikeilikebetweenregexp||)ANDORADDSUBMULDIVBIN_ANDBIN_ORXORMODEQLTLTEGTGTENEINNOT_INISIS_NOTLIKEILIKEBETWEENREGEXPCONCATINNERz LEFT OUTERz RIGHT OUTERFULL)r LEFT_OUTER RIGHT_OUTERrr) eqltltegtgtenerrrrrcCs|}|||Sr?)copyupdate)source overridesmergedr@r@rC merge_dictrs rcsfdd}|_|S)z Method decorator that will "clone" the object before applying the given method. This ensures that state is mutated in a more predictable fashion, and promotes the use of method-chaining. cs|}|f|||Sr?clone)rAargskwargsr funcr@rCinner}szreturns_clone..inner) call_localr rr@r rC returns_clonews rcsfdd}|S)zu Method decorator to indicate a method is not allowed to be called. Will raise a `NotImplementedError`. cstdt|jfdS)Nz!%s is not allowed on %s instances)NotImplementedErrortyperErAr r r r@rCrsznot_allowed..innerr@rr@r rC not_alloweds rcsHeZdZdZddgZddZddZdd Zd d Zfd d Z Z S)r3zg Proxy class useful for situations when you wish to defer the initialization of an object. obj _callbackscCsg|_|ddSr?)r initializerAr@r@rC__init__szProxy.__init__cCs||_|jD] }||q dSr?)rr)rArcallbackr@r@rCrs zProxy.initializecCs|j||Sr?)rr)rArr@r@rCattach_callbacks zProxy.attach_callbackcCs|jdkrtdt|j|S)NzCannot use uninitialized Proxy.)rAttributeErrorrrr@r@rCrs zProxy.__getattr__cs$||jkrtdtt|||S)NzCannot set attribute on proxy.) __slots__rsuperr3 __setattr__rArra __class__r@rCr s zProxy.__setattr__) rErFrG__doc__rrrrrr  __classcell__r@r@r"rCr3sc@s8eZdZeZd ddZddZddZedd Z dS) rNcCs(g|_|dk r$||_|j|dSr?)fieldslower_rel_model_name _unresolvedr)rArel_model_namer@r@rCrs zDeferredRelation.__init__cCs|j|||fdSr?)r&r)rArfieldrr@r@rC set_fieldszDeferredRelation.set_fieldcCs(|jD]\}}}||_|||qdSr?)r& rel_model add_to_class)rAr-rr+rr@r@rC set_modelszDeferredRelation.set_modelcCs>ttj}|D]*}|j|jkr||tj|qdSr?)rrr)r(rEr'r/discard) model_cls unresolveddrr@r@rCresolves   zDeferredRelation.resolve)N) rErFrGrr)rr,r/ staticmethodr4r@r@r@rCrs  c@seZdZdddZdS) _CDescriptorNcCs|dk rt|jS|Sr?)Entity_aliasrAinstance instance_typer@r@rC__get__s z_CDescriptor.__get__)N)rErFrGr<r@r@r@rCr6sr6c@seZdZdZeZdZddZed5ddZ d d Z d d Z e d dZ e d6ddZe ddZe ddZe ddZddZddZd7ddZeejZeejZeejZeejZeejZeej Z!Z"eej#Z$eejddZ%eejddZ&eejddZ'eej ddZ(Z)eejddZ*eejddZ+eej#ddZ,dd Z-d!d"Z.eej/Z0eej1Z2eej3Z4eej5Z6eej7Z8eej9Z:eej;Zeej?Z@eejAZBd#d$ZCd%d&ZDd8d'd(ZEd)d*ZFd+d,ZGd-d.ZHd/d0ZId1d2ZJd3d4ZKdS)9Nodez=Base-class for any part of a query which shall be composable.nodecCsd|_d|_d|_d|_dSNF)_negatedr8_bind_to _orderingrr@r@rCrsz Node.__init__NFcsfdd}|S)Ncs&p|j}rt|}t|||Sr?)rErsetattr)method method_namer clsrr@rC decorators   zNode.extend..decoratorr@)rGrr rHr@rFrCextendsz Node.extendcCs t|Sr?)rrr@r@rC clone_baseszNode.clone_basecCs,|}|j|_|j|_|j|_|j|_|Sr?)rJr@r8rBrA)rAinstr@r@rCr s z Node.clonecCs|j |_dSr?)r@rr@r@rC __invert__szNode.__invert__cCs ||_dSr?r8)rAar@r@rCaliassz Node.aliascCs ||_dS)z Bind the results of an expression to a specific model type. Useful when adding expressions to a select, where the result of the expression should be placed on a joined instance. N)rA)rAbtr@r@rCbind_tosz Node.bind_tocCs d|_dS)NASCrBrr@r@rCascszNode.asccCs d|_dS)NDESCrSrr@r@rCdescsz Node.desccCs|Sr?)rTrr@r@rC__pos__sz Node.__pos__cCs|Sr?)rVrr@r@rC__neg__ sz Node.__neg__csfdd}|S)z Lightweight factory which returns a method that builds an Expression consisting of the left-hand and right-hand operands, using `op`. csrt||St||Sr?) ExpressionrArhsinvopr@rCrs zNode._e..innerr@)r^r]rr@r\rC_e szNode._eT)r]cCs$|dkrt|tjdSt|tj|Sr?)rYOPrrrZr@r@rC__eq__'sz Node.__eq__cCs$|dkrt|tjdSt|tj|Sr?)rYr`rrrZr@r@rC__ne__+sz Node.__ne__cCst|tj|Sr?)rYr`rrZr@r@rCin_=szNode.in_cCst|tj|Sr?)rYr`rrZr@r@rCnot_in?sz Node.not_incCs |rt|tjdSt|tjdSr?)rYr`rr)rAis_nullr@r@rCreAsz Node.is_nullcCst|tjd|S)Nz%%%s%%rYr`rrZr@r@rCcontainsEsz Node.containscCst|tjd|S)Nz%s%%rfrZr@r@rC startswithGszNode.startswithcCst|tjd|S)Nz%%%srfrZr@r@rCendswithIsz Node.endswithcCst|tjt|td|S)Nr)rYr`rrr4)rAlowhighr@r@rCrKsz Node.betweencCst|tj|Sr?)rYr`r)rA expressionr@r@rCrMsz Node.regexpcCst|tj|Sr?)rYr`rrZr@r@rCconcatOsz Node.concat)NF)N)F)T)LrErFrGr$r6rT _node_typer classmethodrIrJr rrLrOrQrTrVrWrXr_r`r__and__r__or__r__add__r__sub__r__mul__r__div__ __truediv__r__xor____radd____rsub____rmul____rdiv__ __rtruediv____rand____ror____rxor__rarbr__lt__r__le__r__gt__r__ge__r __lshift__r __rshift__r__mod__r__pow__rbin_andrbin_orrcrdrergrhrirrrmr@r@r@rCr=sp                       r=cs,eZdZdZdZfddZddZZS)r7z2An unescaped SQL string, with optional parameters.sqlcs||_||_tt|dSr?)raparamsrr7r)rArarr"r@rCrVsz SQL.__init__cCst|jf|jSr?)r7rarrr@r@rCrJ[szSQL.clone_baserErFrGr$rnrrJr%r@r@r"rCr7Rs cs4eZdZdZdZfddZddZddZZS) r7z/A quoted-name or entity, e.g. "table"."column".entitycstt|||_dSr?)rr7rpath)rArr"r@rCrcszEntity.__init__cCs t|jSr?)r7rrr@r@rCrJgszEntity.clone_basecCsttd|j|fSr?)r7filterrrr@r@rCrjszEntity.__getattr__) rErFrGr$rnrrJrr%r@r@r"rCr7_s  r7csTeZdZdZdZedZfddZedddZ d d Z dd d Z ddZ Z S)FunczAn arbitrary SQL function call.r )countsumcs6||_||_|r||jknd|_tt|dSr?)r argumentsr' _no_coerce_coercerrr)rArrr"r@rCrrsz Func.__init__TcCs ||_dSr?)r)rAcoercer@r@rCrxsz Func.coercecCst|jf|j}|j|_|Sr?)rrrr)rAresr@r@rCrJ|szFunc.clone_baseNcCsJt|tr|dkr|}|dkr0t||d}n t|j}t|td|S)N) partition_byorder_byOVER)rSr=__sql__r7r8r)rArrwindowrr@r@rCovers  z Func.overcsfdd}|S)Ncstf||Sr?)rr r rr@rCdecszFunc.__getattr__..decr@)rArrr@rrCrs zFunc.__getattr__)T)NNN)rErFrGr$rnrrrrrrJrrr%r@r@r"rCrms   rcs.eZdZdZdZdfdd ZddZZS) rYz0A binary expression, e.g `foo + 1` or `bar < 7`.rlFcs*tt|||_||_||_||_dSr?)rrYrlhsr^r[flat)rArr^r[rr"r@rCrs zExpression.__init__cCst|j|j|j|jSr?)rYrr^r[rrr@r@rCrJszExpression.clone_base)Frr@r@r"rCrYsrYcs.eZdZdZdZdfdd ZddZZS) r.z Arbitrary parameter passed into a query. Instructs the query compiler to specifically treat this value as a parameter, useful for `list` which is special-cased for `IN` lookups. paramNcs||_||_tt|dSr?)raadaptrr.r)rArarr"r@rCrszParam.__init__cCst|j|jSr?)r.rarrr@r@rCrJszParam.clone_base)Nrr@r@r"rCr.sc@seZdZdZdS) Passthrough passthroughN)rErFrGrnr@r@r@rCrsrcs4eZdZdZdZdZdZfddZddZZ S) rz8A SQL clause, one or more Node objects joined by spaces.clause Fcs@d|kr|d|_d|kr$|d|_tt|t||_dS)Nglueparens)rrrrrrnodes)rArr r"r@rCrs   zClause.__init__cCst|j}|j|_|j|_|Sr?)rrrrrAr r@r@rCrJs zClause.clone_base) rErFrGr$rnrrrrJr%r@r@r"rCrs  c@seZdZdZdZdS) CommaClausez5One or more Node objects joined by commas, no parens., N)rErFrGr$rr@r@r@rCrsrc@seZdZdZdZdS)EnclosedClausezAOne or more Node objects joined by commas and enclosed in parens.TN)rErFrGr$rr@r@r@rCrsrcs.eZdZdfdd ZddZddZZS) r=Ncs*tt|||_||_|jp"d|_dS)Nw)rr=rrrr8)rArrr"r@rCrszWindow.__init__cCsPg}|jr$|ttdt|j|jrD|ttdt|jtt|S)Nz PARTITION BYORDER BY)rrrr7rrr)rA over_clausesr@r@rCrszWindow.__sql__cCst|j|jSr?)r=rrrr@r@rCrJszWindow.clone_base)NN)rErFrGrrrJr%r@r@r"rCr=s cCs td|S)Nz CHECK (%s)r7)rar@r@rCrscs(eZdZdZfddZddZZS)rz:A "django-style" filter expression, e.g. {'foo__eq': 'x'}.c stt|||_dSr?)rrrqueryrArr"r@rCrsz DQ.__init__cCs tf|jSr?)rrrr@r@rCrJsz DQ.clone_base)rErFrGr$rrJr%r@r@r"rCrs cs eZdZdZfddZZS) _StripParensrwcstt|||_dSr?)rrrr>)rAr>r"r@rCrsz_StripParens.__init__)rErFrGrnrr%r@r@r"rCrsr JoinMetadata src_model dest_modelsrcdestr primary_keyr is_backrefrO is_self_join is_expressionc@s:eZdZd ddZddZddZdd Zed d ZdS) JoinNcCsXt|tst|trdS|j||}|dk r6|dfS|j||}|dk rT|dfSdS)NNNFT)rS SelectQueryr rel_for_modelreverse_rel_for_model)rArrr+fk_fieldrr@r@rCget_foreign_key szJoin.get_foreign_keycCs |jp tjSr?) join_typer&rrr@r@rC get_join_typeszJoin.get_join_typecCs$t|tr|jSt|tr |jS|Sr?)rS ModelAliasrr)rAmodel_or_aliasr@r@rCmodel_from_aliass   zJoin.model_from_aliasc CsB||j}||j}t|jtr,|jjp.d}t|jttt f}t|jt t frX|jpZd}|rt|}|j |j jk}n6||||j\}}|dkr|jdk r|||\}}|dk r|j}nd}|s|dk r|r|j j} n|j } n.z|jjj } Wntk r|j j} YnXnd} t|||j|j|p,| ||||||k|d S)Nr)rrrrSonr=r8rYrr7r FieldProxyrrr&rto_fieldrrrr) rArr join_aliasron_fieldrrr target_attrr@r@rC_join_metadatasJ   zJoin._join_metadatacCst|ds||_|jS)N_cached_metadata)hasattrrrrr@r@rCmetadataPs  z Join.metadata)N) rErFrGrrrrpropertyrr@r@r@rCr s  1r_Join)rrrrc@s&eZdZddZdddZddZdS) FieldDescriptorcCs||_|jj|_dSr?)r+ratt_namerAr+r@r@rCrYszFieldDescriptor.__init__NcCs|dk r|j|jS|jSr?)_datagetrr+r9r@r@rCr<]szFieldDescriptor.__get__cCs||j|j<|j|jdSr?)rr_dirtyrrAr:rar@r@rC__set__bs zFieldDescriptor.__set__)N)rErFrGrr<rr@r@r@rCrVs rc seZdZdZdZdZdZdZd#fdd Zd d Z d d Z d dZ ddZ ddZ ddZddZddZddZd$ddZddZdd Zd!d"ZZS)%rzA column on a table.rr+unknownFNc s||_||_||_||_||_||_||_||_| |_| |_ | |_ | |_ t j d7_ t j |_|jrhdpjd|jf|_d|_tt |dS)NrrNF)nullindexunique verbose_name help_text db_columndefaultchoicesrsequence constraintsschemar_field_counter_order _sort_key _is_boundrr) rArrrrrrrrrrrrr"r@rCrms"zField.__init__cKsft|f|j|j|j|j|j|j|j|j|j |j |j |j d |}|j rZ|j|_|j|_|j |_ |S)N) rrrrrrrrrrrr)rrrrrrrrrrrrrrrr)rAr rKr@r@rCrJs* zField.clone_basecCsZ||_||_|jp|j|_|js4tdd||_|j|t ||t |d|_ dS)z Hook that replaces the `Field` attribute on a class with a named `FieldDescriptor`. Called by the metaclass during construction of the `Model`. _+rTN) rrrrrsubtitler add_fieldrCrrrArrr@r@rCr.s zField.add_to_classcCs |jjjSr?)rrdatabaserr@r@rC get_databaseszField.get_databasecCs|}||Sr?) get_db_fieldrcompilerget_column_type)rA field_typer@r@rCrszField.get_column_typecCs|jSr?)db_fieldrr@r@rCrszField.get_db_fieldcCsdSr?r@rr@r@rC get_modifiersszField.get_modifierscCs|Sr?r@rArar@r@rCrsz Field.coercecCs|dkr |S||S)z5Convert the python value for storage in the database.Nrrr@r@rCdb_valueszField.db_valuecCs|dkr |S||S)z/Convert the database value to a pythonic value.Nrrr@r@rC python_valueszField.python_valuecCs |rt|jjj|jSt|jSr?)r7rrrr)rA with_tabler@r@rC as_entityszField.as_entitycCs0|}|r(td|dtt|fSt|S)z2Return the column type, e.g. VARCHAR(255) or REAL.%s(%s)r)rr7joinmapstr)rA column_type modifiersr@r@rC__ddl_column__s zField.__ddl_column__cCsj|||g}|js&|td|jr:|td|jrT|td|j|jrf||j|S)z8Return a list of Node instances that defines the column.zNOT NULL PRIMARY KEYzDEFAULT NEXTVAL('%s')) rr rrr7rrrrI)rArddlr@r@rC__ddl__s z Field.__ddl__cCst|jd|jjSN.)hashrrrErr@r@rC__hash__szField.__hash__) FFFNNNNNFNNN)F)rErFrGr$rrrnrrrJr.rrrrrrrrr r rr%r@r@r"rCrfs:  cs.eZdZdZdfdd ZfddZZS)r bareNcs$tt|j|||dk r ||_dSr?)rr rr)rArr r r"r@rCrszBareField.__init__c stt|jfd|ji|S)Nr)rr rJrrAr r"r@rCrJszBareField.clone_base)N)rErFrGrrrJr%r@r@r"rCr sc@seZdZdZeZdS)r"intN)rErFrGrrrr@r@r@rCr"sc@seZdZdZdS)r bigintNrErFrGrr@r@r@rCr sc@seZdZdZdS)r5smallintNrr@r@r@rCr5scs eZdZdZfddZZS)r1rcsd|d<tt|j||dS)NTr)rr1rrr"r@rCrszPrimaryKeyField.__init__)rErFrGrrr%r@r@r"rCr1scs eZdZdZfddZZS)_AutoPrimaryKeyFieldNcs4||jkrtdt||ftt|||dS)Nz%s must be named `%s`.) _column_namer|rrrr.rr"r@rCr.s z!_AutoPrimaryKeyField.add_to_class)rErFrGrr.r%r@r@r"rCrsrc@seZdZdZeZdS)rfloatN)rErFrGrrrr@r@r@rCrsc@seZdZdZdS)rdoubleNrr@r@r@rCr scsFeZdZdZdfdd Zfdd Zd d Zd d ZddZZ S)rdecimal rFNcs6||_||_||_|ptjj|_tt|j||dSr?) max_digitsdecimal_places auto_roundrDefaultContextroundingrrr)rArrr r"r r r"r@rCrs zDecimalField.__init__c s(tt|jf|j|j|j|jd|S)N)rrr r")rrrJrrr r"rr"r@rCrJs zDecimalField.clone_basecCs |j|jgSr?)rrrr@r@rCrszDecimalField.get_modifierscCsTtj}|s|dkr|S|dS|jrP|d|j }|j}|t|j||dS|S)Nrr)r")rDecimalr rr"rquantize)rAraDexpr"r@r@rCr"szDecimalField.db_valuecCs*|dk r&t|tjr|Stt|SdSr?)rSrr#rrr@r@rCr,s zDecimalField.python_value)rrFN) rErFrGrrrJrrrr%r@r@r"rCr s  utf-8cCs*t|tr|St|tr"||St|Sr?)rS unicode_type string_typedecode)r]encodingr@r@rCcoerce_to_unicode2s    r,cs>eZdZdZd fdd ZfddZddZd d ZZS) rstringcs||_tt|j||dSr?) max_lengthrrr)rAr/r r r"r@rCr<szCharField.__init__c stt|jfd|ji|S)Nr/)rrrJr/rr"r@rCrJ@s zCharField.clone_basecCs|jr|jgpdSr?)r/rr@r@rCrEszCharField.get_modifierscCs t|pdSNr,rr@r@rCrHszCharField.coerce)r.) rErFrGrrrJrrr%r@r@r"rCr9s  cs eZdZdZfddZZS)r fixed_charcs tt||}|r|}|Sr?)rrrstriprr"r@rCrNszFixedCharField.python_value)rErFrGrrr%r@r@r"rCrKsc@seZdZdZddZdS)r8textcCs t|pdSr0r2rr@r@rCrWszTextField.coerceN)rErFrGrrr@r@r@rCr8Tscs4eZdZdZeZfddZddZddZZ S)r blobcs0t|jjtr|jj|jtt|||Sr?) rSrrr3r_set_constructorrr r.rr"r@rCr.^szBlobField.add_to_classcCs||_dSr?)get_binary_type _constructor)rArr@r@rCr7cszBlobField._set_constructorcCs,t|tr|d}t|tr(||S|SrX)rSr(r[ basestringr9rr@r@rCrfs     zBlobField.db_value) rErFrGrbinary_constructr9r.r7rr%r@r@r"rCr Zs  c@s eZdZdZddZddZdS)r<uuidcCs6t|tjr|jSzt|jWS|YSXdSr?)rSr<UUIDhexrr@r@rCrps  zUUIDField.db_valuecCs&t|tjr|S|dkrdSt|Sr?)rSr<r=rr@r@rCrxs zUUIDField.python_valueN)rErFrGrrrr@r@r@rCr<mscsfdd}|S)Ncs|jjj|Sr?)rrr extract_dater date_partr@rCr~sz_date_part..decr@)rArr@r@rC _date_part}s rBcs.eZdZdZdfdd ZfddZZS)_BaseFormattedFieldNcs$|dk r||_tt|j||dSr?)r}rrCr)rAr}r r r"r@rCrsz_BaseFormattedField.__init__c stt|jfd|ji|S)Nr})rrCrJr}rr"r@rCrJs z_BaseFormattedField.clone_base)N)rErFrGr}rrJr%r@r@r"rCrCsrCc@sjeZdZdZdddgZddZeedZeedZ eed Z eed Z eed Z eed Z d S)rrzrrrcCs|rt|trt||jS|Sr?)rSr:rur}rr@r@rCrs zDateTimeField.python_valuerrrrrrN)rErFrGrr}rrrBrrrrrrr@r@r@rCrs     c@sFeZdZdZdddgZddZeedZeedZ eed Z d S) rdaterrrcCs@|r$t|tr$dd}t||j|S|r.)rSr:rur}rzrDrArappr@r@rCrs zDateField.python_valuerrrN) rErFrGrr}rrrBrrrr@r@r@rCrs  c@sJeZdZdZdddddgZddZeed Zeed Z eed Z d S) r9timerrrrrcCs`|r8t|tr$dd}t||j|St|tjr8|S|dk r\t|tjr\tjj|S|S)NcSs|Sr?)rGrxr@r@rCrUrVz(TimeField.python_value..)rSr:rur}rzrG timedeltaminrEr@r@rCrs  zTimeField.python_valuerrrN) rErFrGrr}rrrBrrrr@r@r@rCr9s  csFeZdZddedDZfddZddZdd Zd d ZZ S) r:cCsg|] }d|qS)rr@.0rr@r@rC szTimestampField.cs|ddpd|_|j|jkrsz*TimestampField.__init__..utcFr)poprNvalid_resolutionsr|rrPrzutcfromtimestamp fromtimestamp_convutcnownow setdefaultrr:r)rAr r _dt_defaultr"r@rCrs  zTimestampField.__init__cCs|jdkr|jStjSNr)rNrr rr@r@rCrszTimestampField.get_db_fieldcCs|dkr dSt|tjrn4t|tjrr)rSrzrDrrrrroundrNrPcalendartimegm utctimetuplerGmktime timetuple microsecond)rAra timestampr@r@rCrs    zTimestampField.db_valuecCsp|dk rlt|tttfrl|dkr$dS|jdkrbd|j}t||j\}}||}||j|dS||S|S)Nrrri)rb)rSrrlongrNdivmodrUreplace)rAraticks_to_microsecondticksrkr@r@rCrs   zTimestampField.python_value) rErFrGrrRrrrrr%r@r@r"rCr:s  c@seZdZdZeZdS)rboolN)rErFrGrrirr@r@r@rCrscs:eZdZdZfddZddZd ddZd d ZZS) RelationDescriptorzEForeign-key abstraction to replace a related PK with a related model.cs||_tt||dSr?)r-rrjr)rAr+r-r"r@rCrszRelationDescriptor.__init__cCsn|j|j}|dk s"|j|jkrZ|j|jkrN|j|jj|k}||j|j<|j|jS|jjsj|jj|Sr?) rrr _obj_cacher-r+rrr)rAr:rel_idrr@r@rCget_object_or_ids   z#RelationDescriptor.get_object_or_idNcCs|dk r||S|jSr?)rmr+r9r@r@rCr<s zRelationDescriptor.__get__cCs|t||jr2t||jjj|j|j<||j|j<n8|j |j}||j|j<||krj|j|jkrj|j|j=|j |jdSr?) rSr-rr+rrrrrkrrr)rAr:ra orig_valuer@r@rCr"s    zRelationDescriptor.__set__)N) rErFrGr$rrmr<rr%r@r@r"rCrj s   rjc@s"eZdZdZddZdddZdS)ReverseRelationDescriptorz.callbackz%s_id_idrrrAcs.|jdjjfjdt||dS)Nz%s.%s)r+backref obj_id_name)rrrr}r)msgcontextrrrrAr@rCinvalids z-ForeignKeyField.add_to_class..invalidzVThe related_name of %(field)s ("%(backref)s") conflicts with a field of the same name.zWThe related_name of %(field)s ("%(backref)s") is already in use by another foreign key.zRThe object id descriptor of %(field)s conflicts with a field named %(obj_id_name)sz]Model attribute "%(obj_id_name)s" would be shadowed by the object id descriptor of %(field)s.T)rSr-r3rrr,rrrrrrrrrr~r}rrrrvalidate_backrefsr&r__dict__rCrrrrrel)rArrrrr@rrCr.qsR              zForeignKeyField.add_to_classcs$t|jts|jStt|S)zr Overridden to ensure Foreign Keys use same column type as the primary key they point to. )rSrr1rrr rr"r@rCrs  zForeignKeyField.get_db_fieldcs$t|jts|jStt|Sr?)rSrr1rrr rr"r@rCrs  zForeignKeyField.get_modifierscCs |j|Sr?)rrrr@r@rCrszForeignKeyField.coercecCs t||jr|}|j|Sr?)rSr- _get_pk_valuerrrr@r@rCrs zForeignKeyField.db_valuecCst||jr|S|j|Sr?)rSr-rrrr@r@rCrs zForeignKeyField.python_value)NNNNN)rErFrGrrJrrrr~r.rrrrrr%r@r@r"rCr Hs  @ c@sFeZdZdZdZddZddZdddZd d Zd d Z d dZ dS)rz+A primary key composed of multiple columns.NcGs ||_dSr?) field_names)rArr@r@rCrszCompositeKey.__init__cCs||_||_t|||dSr?)rrrCrr@r@rCr.szCompositeKey.add_to_classcs$dk r tfdd|jDS|S)Ncsg|]}t|qSr@)rrK field_namer:r@rCrLsz(CompositeKey.__get__..)tuplerr9r@rrCr<s  zCompositeKey.__get__cCsdSr?r@rr@r@rCrszCompositeKey.__set__cs&fddtj|D}ttj|S)Ncs"g|]\}}jjj||kqSr@)rrr&)rKr+rarr@rCrLsz'CompositeKey.__eq__..)ziprrRoperatorand_)rAother expressionsr@rrCras  zCompositeKey.__eq__cCst|jj|jfSr?)rrrErrr@r@rCrszCompositeKey.__hash__)N) rErFrGr$rrr.r<rrarr@r@r@rCrs c@sDeZdZdZdddZddZddd Zd d Zd d ZddZ dS)AliasMaprprcCsi|_||_dSr?) _alias_map_counter)rAstartr@r@rCrszAliasMap.__init__cCs d|jS)Nzrrr@r@rC__repr__szAliasMap.__repr__NcCs:||jkrdS|jd7_|p.d|j|jf|j|<dS)Nrz%s%s)rrprefix)rArrOr@r@rCrs z AliasMap.addcCs||jkr|||j|Sr?)rrrArr@r@rC __getitem__s  zAliasMap.__getitem__cCs ||jkSr?rrr@r@rC __contains__szAliasMap.__contains__cCs.|r*|jD]\}}||kr||j|<q|Sr?)ritems)rA alias_maprrOr@r@rCrs  zAliasMap.update)r)N) rErFrGrrrrrrrr@r@r@rCrs  rc2@seZdZddddddddd dd d dd d d dZejdejdejdejdej dej dej dej dej dejdejdejdejdejdejdejdejdejd ejd!ejd"ejd#ejd$ejd%ejd&ejd'iZej d(ej!d)ej"d*ej#d+iZ$e%Z&dd/d0Z'd1d2Z(d3d4Z)d5d6Z*d7d8Z+d9d:Z,d;d<Z-d=d>Z.d?d@Z/dAdBZ0dCdDZ1dEdFZ2dGdHZ3dIdJZ4dKdLZ5dMdNZ6dOdPZ7dQdRZ8dSdTZ9ddUdVZ:ddXdYZ;ddZd[Zdd`daZ?dbdcZ@eAfdddeZBdfdgZCdhdiZDdjdkZEdldmZFdndoZGddpdqZHeGdrZIddtduZJeGdvZKddwdxZLeGdyZMddzd{ZNeGd|ZOd}d~ZPddZQeGdZRdddZSeGdZTddZUeGdZVddZWeGdZXd.S) QueryCompilerr1BIGINTBLOBSMALLINTDATEDATETIMEDECIMALREALCHARINTEGERVARCHARTEXTTIME)rrr6rirDrzrrr3rrrrr-r5rGrrrrrrrzNOT INrzIS NOTrrrrrrrrr#rrrrrz INNER JOINzLEFT OUTER JOINzRIGHT OUTER JOINz FULL JOIN"?NcCsJ||_||_t|j|pi|_t|j|p*i|_||_t dg|_ dS)Nr) quote_char interpolationr field_map _field_mapop_map_op_map get_parse_map _parse_mapr_unknown_types)rArrfield_overrides op_overridesr@r@rCrHs  zQueryCompiler.__init__c Cs2|j|j|j|j|j|j|j|j|j|j |j d S)N) rlrrr rrr+r select_querycompound_select_queryrw) _parse_expression _parse_param_parse_passthrough _parse_func _parse_clause _parse_entity _parse_field _parse_sql_parse_select_query_parse_compound_select_query_parse_strip_parensrr@r@rCrQszQueryCompiler.get_parse_mapcCsd|j||jfS)Nz%s%s%s)r)rAr]r@r@rCquotebszQueryCompiler.quotecCs||jkr|j|S|Sr?)rupper)rAfr@r@rCreszQueryCompiler.get_column_typecCs |j|Sr?)r)rAqr@r@rCget_ophszQueryCompiler.get_opcCst|dddS)NcSs |djSNr)r)rr@r@rCrUlrVz.QueryCompiler._sorted_fields..r)rr)rA field_dictr@r@rC_sorted_fieldskszQueryCompiler._sorted_fieldscCs |j|gfSr?)rrAr>rconvr@r@rC_parse_defaultnszQueryCompiler._parse_defaultc Cst|jtr|j}||j||\}}||j||\}}|jtjkrd|dkrd|sd|jr\dndgfS|jrndnd}||| |j|f} | ||fS)Nz()z0 = 1z(0 = 1)%s %s %s (%s %s %s)) rSrr parse_noder[r^r`rrr) rAr>rrrlparamsr[rparamstemplaterr@r@rCrqs zQueryCompiler._parse_expressioncCs*|jr|||j|dS|j|jgfSr?)rrrarrr@r@rCr|sz QueryCompiler._parse_passthroughcCs^|jr0|r|j|jkrd}|||j||S|dk rL|||j|S|j|jgfSdSr?)rrrrarrr@r@rCrszQueryCompiler._parse_paramcCs8|jr |p d}||j||\}}d|jt|f|fS)Nr)rparse_node_listrrrwrAr>rrrrr@r@rCrszQueryCompiler._parse_funccCs2||j|||j\}}|jr*dt|}||fSN(%s))rrrrrwrr@r@rCrs zQueryCompiler._parse_clausecCsdt|j|jgfSr)rrrrrr@r@rCrszQueryCompiler._parse_entitycCs|jt|jfSr?)rarrrr@r@rCrszQueryCompiler._parse_sqlcCs<|r(d|||j||jf}n ||j}|gfSr)rrrr)rAr>rrrr@r@rCrs  zQueryCompiler._parse_fieldcCsd}|jj|kr0|jj|kr0|j|j}}d}n|j|j}}d}|}|j|kr\|j|_|||\} } |||||\} } |r| | | | f\} }}}n| | | | f\} }}}|jjrd| |j |f}nd| |j |f}|||fS)NrTFz((%s) %s (%s))r) r[rnralias_map_classrgenerate_selectcalculate_alias_maprcompound_select_parenthesesr)rAr>rrcsqfirst_qsecond_qr]new_mapfirstfirst_prsecond_prlprrprr@r@rCrs*  z*QueryCompiler._parse_compound_select_querycCsV|}|js6|r$t|tr$|j}n |jjj}|f|_| ||\}}dt ||fSr) r _explicit_selectionrSr rrrr_selectrrw)rAr>rrr  select_fieldrrr@r@rCrs z!QueryCompiler._parse_select_querycCs ||j||\}}t||fSr?)rr>rwrr@r@rCrsz!QueryCompiler._parse_strip_parensc Csht|dd}d}||jkrP|j||||\}}||jkoJ|jdkoJ|dk}nt|tttfr|||||\}}d|}nt|t r|j }|rt|t r|j }t|t r| |} q| t||j} n|} | g}nt|rt|t st|tr|||} || ||\}}n@|dk rH| |} || |d\}}} n|||d\}}d}|||fS)NrnFrT)rrrrrSrrrrr*rr rrrrr rvrrrOr_parser) rAr>rr node_typerrrrrar_r@r@rCrs@         zQueryCompiler._parsec s|||\}}}|r6dk r6|r6fdd|D}t|tr||jrNd|}|jrfd|d|jf}|jr|d||jf}|rtdd|Drg}g}t|D] \} } t| tr| | \} } q||fS)Ncsg|]}|qSr@)rrJrr@rCrLsz,QueryCompiler.parse_node..zNOT %srAScss|]}t|tVqdSr?)rSr=)rKpr@r@rCrOsz+QueryCompiler.parse_node..) rrSr=r@r8rrBany enumerater) rAr>rrrrr clean_params clean_sqlidxrcsqlcparamsr@rrCrs"  zQueryCompiler.parse_noderc CsFg}g}|D]*}||||\}} |||| q |||fSr?)rrrIr) rArrrrrrr>node_sql node_paramsr@r@rCrs  zQueryCompiler.parse_node_listcCs|}|dk r|j|_||j|jjj|jD]V\}}|||jj|D]8}t|j t rv||j |j j qR||j |j jjqRq6| |Sr?) rrrrr table_alias_joinsrrSrr=rOr)rArrrr joined_modelsjoin_objr@r@rCrs z!QueryCompiler.calculate_alias_mapcCs|t||Sr?)rr)rAclausesrr@r@rC build_query*szQueryCompiler.build_querycCsZg}t}|g}|rV|}||ks||kr0q||||D]}|} |j} t|jtttt frv|j } nl|j } | j r|j} |j}n |j} |j}| j}|rt| |j}t||jj}| j r||}}||k} ntdt| tr| }n|| |  || }|}||jkr2t|j|}nt|}|t||td| qBq|S)Nz Missing required join predicate.ON)rrQrrrSrrYrrr7r rOrrrrrrrr|r=rrrjoin_mapr7)rAjoinsrrrrrcurrrrr constraintrfk_modelpk_modelfkrr[dest_nrjoin_sqlr@r@rCgenerate_joins-sN       zQueryCompiler.generate_joinsc Cs.|j}|jj}|||}t|tr0t|g}n|jsBtdg}n*tdg}|jdkrl|tdt |jg7}t |j }d|_ | |tdf|jdkr||||n|t|j|jdk r|td|tdd |jD||j||}|r| ||jdk r4| td |jg|jrT| td t|jg|jrp| td |jg|jr| td t|jg|jdk s|jr|jr|jdk r|jn|j}|td||jdk r|td|j|j\} } | r"| rdnd} |t| |||S)NSELECTzSELECT DISTINCT)TFr rFROMWINDOWcSs&g|]}tt|jtd|qS)r)rr7r8r)rKrr@r@rCrL}s z1QueryCompiler.generate_select..WHEREzGROUP BYHAVINGrzLIMIT %sz OFFSET %szFOR UPDATE NOWAITz FOR UPDATE)rrrrrSCompoundSelectr _distinctr7rrrrrI_fromrrrOr_windowsrr_where _group_by_having _order_by_limit_offset limit_max _for_updater) rArrrdbr select_clause join_clauseslimit for_updateno_waitstmtr@r@rCrbsT               zQueryCompiler.generate_selectc Cs|j}|}|||jj|jr0d|j}nd}t||tdg}g}||j D]D\}}t |t t fs~t ||jd}|t|jddtj|ddqZ|t||jr|td |jg|jdk rt|j} d | _|td | g|||S) Nz UPDATE OR %sUPDATESETrFrT)rrr RETURNING)rrrrr _on_conflictr7rr_updaterSr=r*r.rrrYr`rrrrI _returningrrr) rArrr statementrrr+rareturning_clauser@r@rCgenerate_updates2     zQueryCompiler.generate_updatecCs|dd|DS)NcSsg|]}|jddqS)Fr/rrKr+r@r@rCrLsz3QueryCompiler._get_field_clause..r@)rAr& clause_typer@r@rC_get_field_clauseszQueryCompiler._get_field_clausecCs|j}|j}|}|||jj|jr4|jj}n|jrFd|j}nd}t || g}|j dk r|j r|| ||j | t|j n|jdk rfgg}}d} |D]n} | st| tdd}d} g} |D]4} | | } t| ttfst| | jd} | | q| t| q|rF|||t dt|gn |jjjrf| |j|j|j r|t d |j|!td gn.|j"dk rt#|j"}d |_$|t d |g|%||S) NzINSERT OR %s INTOz INSERT INTOFrrTr.VALUESr0)r9r)&rrrrr_upsertr upsert_sqlr1r7r_query_fieldsrr:r_rows _iter_rowsrkeysr attrgetterrSr=r*r.rrrIrauto_incrementdefault_insert_clauseis_insert_returningget_primary_key_fieldsr3rrr)rArrrKrr4rr& value_clauses have_fieldsrow_dictrr+rar5r@r@rCgenerate_insertsl           zQueryCompiler.generate_insertcCsf|j}td|g}|jr0|td|jg|jdk r\t|j}d|_|td|g||S)Nz DELETE FROMrrr0) rr7rrrIr3rrr)rArrrr5r@r@rCgenerate_deletes  zQueryCompiler.generate_deletecCs ||}||}t|Sr?)rrr r)rAr+rr r@r@rCfield_definition s zQueryCompiler.field_definitioncCsjtdt|td|jt|jg}|jrH|td|j|jrb|td|jt|S)Nz FOREIGN KEY REFERENCESz ON DELETE %sz ON UPDATE %s) r7rrr-rrzrr{r)rAr+r r@r@rCforeign_key_constraints  z$QueryCompiler.foreign_key_constraintcsfdd}|S)Ncst|}||||Sr?)rr)rAr r r function_namer@rCr"s z/QueryCompiler.return_parsed_node..innerr@)rQrr@rPrCreturn_parsed_nodes z QueryCompiler.return_parsed_nodecCsN|pd|jj|j|jjjf}||}ttd|tdt|f|j S)Nzfk_%s_%s_refs_%sz ALTER TABLEzADD CONSTRAINT) rrrr-rOrr7rr7r)rArr+r  fk_clauser@r@rC_create_foreign_key's z!QueryCompiler._create_foreign_keyrTFc s|rdnd}|jgg}}jrPfddjjD}|ttdt|jD]4}|| |t |t rV|j sV|| |qV|jjr|jjD] }t |tst|}||qtt||t||S)NzCREATE TABLE IF NOT EXISTSz CREATE TABLEcsg|]}j|qSr@)r&rrKrrKr@rCrL;sz/QueryCompiler._create_table..r )r composite_keyrrrrr7rdeclared_fieldsrMrSr ryrOrr=r) rArsafer4columnsrpk_colsr+r r@rVrC _create_table5s2        zQueryCompiler._create_tabler\cCs6|rdnd}t||g}|r.|tdt|S)NzDROP TABLE IF EXISTSz DROP TABLECASCADEr7rrr)rAr fail_silentlycascader4r r@r@rC _drop_tablePs  zQueryCompiler._drop_tableracCs<td|g}|r"|td|r4|tdt|S)NzTRUNCATE TABLEzRESTART IDENTITYr]r^)rArrestart_identityr`r r@r@rC_truncate_tableXs zQueryCompiler._truncate_tablerccCsRd|d|f}t|dkrNt|d}d|dd|ddf}|S)Nz%s_%sr@r'7)rrhashlibmd5r[ hexdigest)rAtablerZr index_hashr@r@rC index_namebs  zQueryCompiler.index_namecGs^|jj}|rdnd}||dd|D}tt|t|td|tdd|Df|S)NzCREATE UNIQUE INDEXz CREATE INDEXcSsg|] }|jqSr@rrUr@r@rCrLlsz/QueryCompiler._create_index..r cSsg|] }|qSr@r7r8r@r@rCrLrs)rrrlrr7r7rr)rArr&rr|tbl_namer4rlr@r@rC _create_indexis zQueryCompiler._create_indexrocCs<|jj}|rdnd}||dd|D}tt|t|S)NzDROP INDEX IF EXISTSz DROP INDEXcSsg|] }|jqSr@rmrUr@r@rCrLysz-QueryCompiler._drop_index..)rrrlrr7r7)rArr&r_rnr4rlr@r@rC _drop_indexvs zQueryCompiler._drop_indexrpcCsttdt|S)NzCREATE SEQUENCErr7r7rA sequence_namer@r@rC_create_sequence}szQueryCompiler._create_sequencertcCsttdt|S)Nz DROP SEQUENCErqrrr@r@rC_drop_sequenceszQueryCompiler._drop_sequenceru)rrNN)NN)Nr)N)N)N)N)F)FF)FF)F)YrErFrGrr`rrrrrrrrrrrrrrrrrrrrrrrrrrr&rrrrr rrrrrrrrrrrrrrrrrrrrrrrrrrrr6rr:rKrLrMrOrRrTcreate_foreign_keyr\ create_tablera drop_tablerctruncate_tablerlro create_indexrp drop_indexrtcreate_sequenceru drop_sequencer@r@r@rCr s     '   5 ? >        rc@seZdZdddZdS)SqliteQueryCompilerFcCs |Sr?)deleter)rArrbr`r@r@rCrysz"SqliteQueryCompiler.truncate_tableN)FF)rErFrGryr@r@r@rCr~sr~c@s eZdZddZddZeZdS)ResultIteratorcCs||_d|_dSr)qrw_idx)rArr@r@rCrszResultIterator.__init__cCsf|j|jjkr|jj|j}n6|jjsP|j}|jj||jjd7_nt|jd7_|Sr[)rr_ct _result_cache _populatediterater StopIterationrr@r@rCnexts zResultIterator.nextN)rErFrGrr__next__r@r@r@rCrs rc@sdeZdZdZdddZddZeddZd d Zd d Z d dZ ddZ ddZ e Z dddZdS)QueryResultWrapperz Provides an iterator over the results of a raw Query, additionally doing two things: - converts rows from the database into python representations - ensures that multiple iterations do not result in multiple queries NcCsP||_||_d|_d|_g|_d|_d|_|dk r@|\|_|_n d|_|_dS)NrF) rcursorrrrr _initialized column_meta join_meta)rArrrKr@r@rCrszQueryResultWrapper.__init__cCs|jrt|jSt|SdSr?)riterrrrr@r@rC__iter__s zQueryResultWrapper.__iter__cCs||jSr?) fill_cacherrr@r@rCrszQueryResultWrapper.countcCs|jSr?)rrr@r@rC__len__szQueryResultWrapper.__len__cCs|Sr?r@rArowr@r@rC process_rowszQueryResultWrapper.process_rowcCsV|j}|s2d|_t|jdds,|jtn|jsL||jjd|_| |S)NTr) rfetchonerrcloserrr descriptionrrr@r@rCrs  zQueryResultWrapper.iterateccs|VqdSr?)rrr@r@rCiteratorszQueryResultWrapper.iteratorcCsh|j|jkr*|j|j}|jd7_|S|jr4t|}|j||jd7_|jd7_|Sr[)rrrrrrr)rArKrr@r@rCrs   zQueryResultWrapper.nextcCs`|p td}|dkrtd|j|_|js\||jkr\z t|Wq$tk rXYq\Yq$Xq$dS)NInfrz"Negative values are not supported.)rr|rrrrrrAnr@r@rCrs  zQueryResultWrapper.fill_cache)N)N)rErFrGr$rrrrrrrrrrrr@r@r@rCrs    rc@s$eZdZddZddZddZdS)ExtQueryResultWrappercCst|}g|_}|jdk rht|j}t|jD](\}}|||s0|||d|q0||krldSnd}t||D]}|||d|qvdSr)rrrr_initialize_node_initialize_by_namer)rArn_colsrn_metarr>r@r@rCrs    z ExtQueryResultWrapper.initializecCsH|jjj}||kr2||}|j||j|jfn|j||dfdSr?)rrrZrrrr)rArr model_colsr+r@r@rCr s  z)ExtQueryResultWrapper._initialize_by_namecCst|tr*|j||jp|j|jfdSt|trt|j r|j d}t|tr|jpb|jpb|j}|j rp|jprd}|j|||fdSdS)NTrF) rSrrrr8rrrrrr)rAr>rargrr r@r@rCr s   z&ExtQueryResultWrapper._initialize_nodeN)rErFrGrrrr@r@r@rCrsrc@seZdZddZdS)TuplesQueryResultWrappercstfddt|DS)Ncs8g|]0\}}j|ddkr"|nj|d|qS)rNNr)rKrcolrr@rCrL sz8TuplesQueryResultWrapper.process_row..)rrrr@rrCr s z$TuplesQueryResultWrapper.process_rowNrErFrGrr@r@r@rCr src@seZdZddZdS)NaiveQueryResultWrappercCsJ|}|jD].\}}}t|||dk r2|||n||q||Sr?)rrrC_prepare_instance)rArr:rcolumnrr@r@rCr! s &z#NaiveQueryResultWrapper.process_rowNrr@r@r@rCr src@seZdZddZdS)DictQueryResultWrappercCs:i}|jD]*\}}}|dk r(|||n||||<q |Sr?r)rArrrrrr@r@rCr, s"z"DictQueryResultWrapper.process_rowNrr@r@r@rCr+ src@s>eZdZddZddZddZddZdd d Zd d Zd S)ModelQueryResultWrappercCs4|\|_}tdd|jD|_|||_dS)Ncss|]}t|tr|VqdSr?)rSr)rKrr@r@rCrO8 s z5ModelQueryResultWrapper.initialize..)generate_column_map column_maprr_col_setgenerate_join_list join_list)rAr model_setr@r@rCr6 sz"ModelQueryResultWrapper.initializec Csg}t|jg}t|jD]\}}d}}t|trrt|trT|j}|j}|jj }n|j }}|j }|j pn|j }nL|j dkr|j}}n |j }}t|tr|j r|j }nt|tr|jd}|||||f||q||fSN)rrrrrSrr _model_aliasfield_instancerrr8rrAr=r7rrr) rArrrr>rrr constructorr@r@rCr< s,           z+ModelQueryResultWrapper.generate_column_mapc Csg}|j}|jg}|r|}||kr(q||D]|}|j}|j|ksN|j|kr0|jdk r|j|jk}|j|jk} |jj o~|p~| } n d} }} | || || f| |jq0q|Sr?) rrrQrrrrrrrr) rArrr stackcurrentrr fk_present pk_presentcheckr@r@rCrX s2      z*ModelQueryResultWrapper.generate_join_listcCs.||}||}|D] }|q|dSr)construct_instances follow_joinsr)rAr collected instancesrr@r@rCru s    z#ModelQueryResultWrapper.process_rowNc Csi}t|jD]x\}\}}}}|dk r0||kr0q||} ||krJ|||<||} |dkrj|jj|d}t| ||dkr|| n|| q|Sr)rrrrrC) rArrBcollected_modelsrrrrrrar:r@r@rCr| s z+ModelQueryResultWrapper.construct_instancesc CsN||jg}|jD]4\}}}}||j}z||j}Wntk rV||j}YnXd} |r|rv|j|jj } n|r|j|j j } | sq|j dk } | o|j |jkot ||j j dk} | rt ||j j |j|j |jr0| o|jdk ot ||j j dk o|j|jj dk} | r0t ||jj |t ||j |||q|SNT)rrrrKeyErrorrrrrrrrrrCrr) rArpreparedr check_nullrrrK joined_insthas_fkmpkcan_populate_joined_pkcan_populate_joined_fkr@r@rCr sX      z$ModelQueryResultWrapper.follow_joins)N) rErFrGrrrrrrr@r@r@rCr5 s  r JoinCacherrcs8eZdZfddZfddZddZddZZS) AggregateQueryResultWrappercsg|_tt|j||dSr?)_rowrrrrr"r@rCr sz$AggregateQueryResultWrapper.__init__cstt||t|_|jD]\}}}}|j|qt|_i|_i|_ i|_ |j D]\}}}}|j rt|j j}n|j}|j p|j}|r|j|jn&|j |jt|j |j|j|j |jit||jp|d|j |j|j<qXi|_i}t|jD]^\}\}} } }||jkrD|j|g|j||| f||g|||| fq|jD]D} | |jkrql|j | d} | D]} |j| || qqldS)Nrr@)rrrr all_modelsrrmodels_with_aggregateback_referencessource_to_destdest_to_sourcerrrr}rrrrXrrrOcolumns_to_comparerrrrI)rArrrrrrkey_to_columnsrrcol_namersources joined_modelr"r@rCr sL       z&AggregateQueryResultWrapper.initializecCsDi}|jD]0\}}g||<|D]\}}||||q"q|Sr?)rrr)rArrr column_datarrr@r@rCread_model_data s  z+AggregateQueryResultWrapper.read_model_datac Cs8|jr|j}n |j}|sDd|_t|jdds>|jtn|js^| |jj d|_dd}i}| |}||j }| D]"\}}t||<|||||<q||}|j} | dkrʐq~t} || } | D]\} } || | kr| | q| s|j| q~|j| }| | |}| D]D\}}d}|jD]}|dk rLd}qL|s6|||||<q6q|j g}|g}|r |}||jkrq|j|D]d}z|j||j\}}Wntk rYqYnX|js|jr||D]}t||gq |j|kr0q||j D]j\}}|dkrTq>z|||j|jj}Wntk rYq>YnXt|||||q>n`|r |j|krq|| D]<\}}||j|j|jj}t||jj|||q||jqq|D]}|q$|S)NTrcs,jjr$tfddjjjDSS)Ncsg|]}j|qSr@)rrrr@rCrL szHAggregateQueryResultWrapper.iterate.._get_pk..)rrWrrrrrr@rrC_get_pk s  z4AggregateQueryResultWrapper.iterate.._get_pkF) rrQrrrrrrrrrrrrrrrrrrrrrrrrrrrCrrr)rArr identity_map _constructedprimary_instancerr: model_datacur_rowduplicate_models cur_row_datardatadifferent_models new_instancesall_nonerarrrrrrpkrKrr@r@rCr s                        z#AggregateQueryResultWrapper.iterate)rErFrGrrrrr%r@r@r"rCr s  6rcseZdZdZdZfddZddZddZd d Zd d Z d+ddZ ddZ e ddZ e ddZe d,ddZe d-ddZd.ddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd/d)d*ZZS)0Queryz?Base class representing a database query on one or more tables.Tcs@tt|||_|jj|_d|_||_|jgi|_d|_ dSr) rrrrrrr _query_ctxrrrArr"r@rCrv s  zQuery.__init__cCs|\}}d|j||fS)Nr)rrrArrr@r@rCr s zQuery.__repr__cCs t||j}|j|_||Sr?)rrr_clone_attributesrr@r@rCr  sz Query.clonecCs,|jdk r|j|_||_|j|_|Sr?)rr  _clone_joinsrrrr@r@rCr s    zQuery._clone_attributescCstdd|jDS)Ncss|]\}}|t|fVqdSr?)r)rKmcjr@r@rCrO sz%Query._clone_joins..)dictrrrr@r@rCr szQuery._clone_joinsNcCs,ttj|}|dkr|S|p tj}|||Sr?)rRrr)rAinitialr conjunctionreducedr@r@rC_add_query_clauses s   zQuery._add_query_clausescCsxg}|D]j}t|tr"||qt|tr8||qt|trR||qt|rt|t r||j j q|Sr?) rSr=rrrrIget_proxy_fieldsr rvr*rrX)rAr accumrr@r@rC_model_shorthand s     zQuery._model_shorthandcGs||j||_dSr?)rrrArr@r@rCrq sz Query.wherecGs||j|tj|_dSr?)rrror_rr@r@rCorwhere s z Query.orwherecCs|j}|s8t|tp(t|o(|j| }|rNtdnt|trN|jj|}|j |g|j | t ||||t|ts||_dS)Nz#A join condition must be specified.) rrSrr r rel_existsr|r:r&rrXrr)rArrrrrequire_join_conditionr@r@rCr s     z Query.joincCs|p|j|_dS)z"Change or reset the query context.N)rrrr@r@rCswitch sz Query.switchcKsN|j}|j|gD]}|j|kr|Sq||j|fd|i||S)Nr)rrrrrr)rAlmrmr join_kwargsctxrr@r@rC ensure_join s   zQuery.ensure_joinc Csg}g}ttf}t|D]\}}|j}d|kr`|dddtkr`|dd\}}t|}ntj}| dD](} t || } t | |rp| j }| | qp| t| ||q||fS)N__r)r rorrrrsplit DJANGO_MAPr`rsplitrrSr-rrY) rAqdictrr  relationshiprrar r^piece model_attrr@r@rCconvert_dict_to_node s     zQuery.convert_dict_to_nodecOsHt}|r$|ttjdd|DM}|r6|tf|M}t|g}t}|r|}t|t s^qFd|j fd|j ffD]`\}}t|tr| |j \} } || ttj| } |j| _|j| _t||| qr||qrqF|j }|} |D]T} t| tr | j| j} }| }n"t| tr.| jj| j} }| j}| | ||} q| |S)NcSsg|] }|qSr@r)rKrNr@r@rCrL sz Query.filter..rr[)r=rRrrrrrpopleftrSrYrr[r rrr@r8rCrr r rr-ror+rrq)rAr r dq_noderdq_joinsr siderrr rlr+rr field_objr@r@rCr s>       z Query.filtercCs |jSr?)rrrr@r@rCr szQuery.compilercCstdSr?rrr@r@rCr sz Query.sqlcCs|\}}|j|||jSr?)rr execute_sqlrequire_commitrr@r@rC_execute s zQuery._executecCstdSr?rrr@r@rCexecute sz Query.executeFcCs6|r|}n |}|r.|s.|dS|SdSr)tuplesrrr)rAas_tupleconvertrr@r@rCscalar s  z Query.scalar)N)NN)N)N)FF)rErFrGr$rrrr rrrrrrqrrrrr rrrrrrr%r@r@r"rCrr s2        (rcsteZdZdZfddZddZedZedZedZ e dd d Z e dd d Z ddZ ddZddZZS)RawQueryzh Execute a SQL query, returning a standard iterable interface that returns model instances. cs6||_t||_d|_d|_d|_tt||dSr?) _sqlr_params_qr_tuples_dictsrrr)rArrrr"r@rCr% s  zRawQuery.__init__cCs*t|j|jf|j}|j|_|j|_|Sr?)rrrrrrrr@r@rCr - szRawQuery.clonejoiningrqrTcCs ||_dSr?rrArr@r@rCr7 szRawQuery.tuplescCs ||_dSr?rrAdictsr@r@rCr$; szRawQuery.dictscCs |j|jfSr?)rrrr@r@rCr? sz RawQuery.sqlcCsX|jdkrR|jr|jt}n |jr2|jt}n |jt}||j| d|_|jSr?) rrrget_result_wrapperRESULTS_TUPLESr RESULTS_DICTS RESULTS_NAIVErr)rAQRWr@r@rCrB s  zRawQuery.executecCs t|Sr?rrrr@r@rCrM szRawQuery.__iter__)T)T)rErFrGr$rr rrrqrrrr$rrrr%r@r@r"rCr s    rcKs8|dd}|rtd|r,|p"g|p*dS|r4|SdS)NrIFz,"extend" is the only valid keyword argument.)rQr|)orignew_valr rIr@r@rC allow_extendP s r-cseZdZdZfddZfddZddZeeZedZ ed Z ed Z d d Z d dZ ddZeeZeddZeddZeddZeddZeddZeddZeddZedZd d!Zed[d#d$Zed\d&d'Zed]d(d)Zed^d*d+Zed_d,d-Zed`d.d/Zedad1d2Zdbd3d4Z dcd5d6Z!ddd7d8Z"ded9d:Z#dfd;d<Z$d=d>Z%d?d@Z&dgdBdCZ'dhdDdEZ(dFdGZ)dHdIZ*dJdKZ+dLdMZ,dNdOZ-dPdQZ.dRdSZ/dTdUZ0dVdWZ1e2rdXdYZ3Z4S)irrcstt|||jj|_|j|d|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_d|_d|_d|_dS)NF)FF)rrrr commit_selectr_SelectQuery__selectrrrr rr!r"rr$_naiverr_aggregate_rowsr8r)rAr selectionr"r@rCr\ s$  zSelectQuery.__init__cstt||}|j|_t|j|_|jdk rhg|_|jD],}t|trZ|j | q:|j |q:|j dk r~t|j |_ |j r|j |_ |j dk rt|j |_ |jdk rt|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|Sr?)rrrrrrrrSr=rr rrr rr!r"rr$r0rrr1r8)rArrr"r@rCrp s6           zSelectQuery._clone_attributescsfdd}|S)Ncs0|jjjj}|kr tdt|j||S)Nz!Your database does not support %s)rrrcompound_operationsr|r)rAr supported_opsrr@rCr s  z&SelectQuery.compound_op..innerr@)rrr@r5rC compound_op s zSelectQuery.compound_opUNION INTERSECTEXCEPTcCs4|jtdt||@d}||B|S)Nrr)rrpr7from_rrOr)rAr[ wrapped_rhsr@r@rCrw szSelectQuery.__xor__cCstd||S)N UNION ALL)r_compound_op_staticrZr@r@rC union_all szSelectQuery.union_allcGs,t|dk|_|p|jjj}|||_dSr)rrrrrXrrrAr2r@r@rC__select szSelectQuery.__selectcGs|r t|nd|_dSr?)rr)rAr r@r@rCr: szSelectQuery.from_cOs|r||nd|_dSr?)rrrr@r@rCgroup_by szSelectQuery.group_bycGs||j||_dSr?)rrrr@r@rChaving szSelectQuery.havingcOst|jt|f||_dSr?)r-r rrr@r@rCr szSelectQuery.order_bycOst|jt|f||_dSr?)r-rr)rAwindowsr r@r@rCr szSelectQuery.windowcCs ||_dSr?)r!)rAlimr@r@rCr( szSelectQuery.limitcCs ||_dSr?)r")rAoffr@r@rCoffset szSelectQuery.offsetcCs$|dkr|d8}||_|||_dSNrr)r!r")rApage paginate_byr@r@rCpaginate szSelectQuery.paginateTcCs ||_dSr?)r)rA is_distinctr@r@rCdistinct szSelectQuery.distinctFcCs||f|_dSr?)r$)rAr)nowaitr@r@rCr) szSelectQuery.for_updatecCs ||_dSr?)r0)rAnaiver@r@rCrO szSelectQuery.naivecCs ||_dSr?r r!r@r@rCr szSelectQuery.tuplescCs ||_dSr?r"r#r@r@rCr$ szSelectQuery.dictscCs ||_dSr?)r1)rAaggregate_rowsr@r@rCrP szSelectQuery.aggregate_rowsNcCs ||_dSr?rM)rArOr@r@rCrO szSelectQuery.aliascCsx|dkrt|jjd}|j|kr4||j}n|}| |j|}|j sbdd|j D|_ t |j |f|_ |S)NrcSsg|] }|qSr@)rO)rKryr@r@rCrL sz(SelectQuery.annotate..) rCountrrrOrrrr rrrr)rAr- annotationrr@r@rCannotate s zSelectQuery.annotatecCs*|dkrttd}|}|g|_|S)Nr)rrQr7rr)rA aggregationrr@r@rC _aggregate s zSelectQuery._aggregatecCs||j|dS)Nr)rUr)rArTrr@r@rC aggregate szSelectQuery.aggregatecCs4|js|js|js|jr$|j|dS|jddp2dS)N clear_limitFrVr)rrr!r" wrapped_countrWrArYr@r@rCr s zSelectQuery.countcCsJ|}|rd|_|_|\}}d|}|jj|f|}|pHdS)Nz+SELECT COUNT(1) FROM (%s) AS wrapped_selectr)rr!r"rrrawr)rArYr rrwrappedrqr@r@rCrZ s  zSelectQuery.wrapped_countcCs$|dd}tdg|_t|S)Nr1)rKr7rrirrr@r@rCexists s  zSelectQuery.existscCsH|dd}zt|WStk rB|jd|YnXdS)Nrz:Instance matching query does not exist: SQL: %s PARAMS: %s)rKrrrrrrrr@r@rCr s zSelectQuery.getrcCs<|}|||jd|}|r8|dkr4|dS|SdSNrr)rrr)rArrrr@r@rCpeek s  zSelectQuery.peekcCs"|j|kr||_d|_|j|dS)NT)r)r!rrbrr@r@rCr& s zSelectQuery.firstcCs||Sr?)rrrr@r@rCr, szSelectQuery.sqlcCsT|j}|jD]B}t|tr*|j|kr*dSt|tr |jdk r |j|kr dSq dS)NFT)rrrSrr=rA)rArr>r@r@rC verify_naive/ s  zSelectQuery.verify_naivecCs |j|jfSr?)rrrr@r@rCget_query_meta9 szSelectQuery.get_query_metacCsf|jr|jtS|jr$|jtS|js8|jr8|rD|jt S|j rV|jt S|jt SdSr?) rrr%r&rr'r0rrcr(r1RESULTS_AGGREGATE_MODELSRESULTS_MODELSrr@r@rC_get_result_wrapper< s    zSelectQuery._get_result_wrappercCsN|js|jdkrD|j}|}|}|||||_d|_|jS|jSdSr?)rrrrdrgr)rAr query_meta ResultWrapperr@r@rCrH szSelectQuery.executecCs t|Sr?r*rr@r@rCrS szSelectQuery.__iter__cCst|Sr?rrrrr@r@rCrV szSelectQuery.iteratorcCsN|}t|tr|j}n|}|dk r:|dkr6|dnd}|||j|SrH)rrSslicestoprr)rArarrr@r@rCrY s  zSelectQuery.__getitem__cCs t|Sr?)rrrr@r@rCrd szSelectQuery.__len__cCst|Sr?)idrr@r@rCrh szSelectQuery.__hash__)rG)T)TF)T)T)T)T)N)N)N)NT)F)F)r)r)5rErFrGrnrrr6r5r=rqrprsrwr>r/rrpr:rArBrrr(rFrKrMr)rOrr$rPrOrSrUrWrrZr`rrbrrrcrdrgrrrrrPY3rr%r@r@r"rCrY s|                           rc@s$eZdZddZddZddZdS)NoopSelectQuerycCs|jdfSNr@)r get_noop_sqlrr@r@rCrl szNoopSelectQuery.sqlcCsdS)Nrr@rr@r@rCrdo szNoopSelectQuery.get_query_metacCs |jtSr?)rr%r&rr@r@rCrgr sz#NoopSelectQuery._get_result_wrapperN)rErFrGrrdrgr@r@r@rCrok srocsPeZdZdZdfdd ZfddZddd Zd d Zd d ZddZ Z S)rrNcs(||_||_||_tt||gdSr?)rrr[rrr)rArrrr[r"r@rCrx szCompoundSelect.__init__cs,tt||}|j|_|j|_|j|_|Sr?)rrrrrr[rr"r@rCr~ s z CompoundSelect._clone_attributesFcCs |j|dS)NrX)rZr[r@r@rCr szCompoundSelect.countcCs |jSr?)rrdrr@r@rCrd szCompoundSelect.get_query_metacCs|jo|jSr?)rrcr[rr@r@rCrc szCompoundSelect.verify_naivecCs|jr|jtS|jr$|jtS|jr6|jtS|jj pD|j j }|jj pZ|j j pZ|j }|sl|rl| rx|jt S|jtSdSr?)rrr%r&rr'r1rerrr[r0rcr(rf)rA has_joinsis_naiver@r@rCrg s    z"CompoundSelect._get_result_wrapper)NNN)F) rErFrGrnrrrrdrcrgr%r@r@r"rCru s  rcsteZdZfddZfddZddZeeddZeedd d Zeedd d Z ddZ ddZ Z S) _WriteQuerycs,d|_d|_d|_d|_tt||dSr?)r3rrrrrtrrr"r@rCr s z_WriteQuery.__init__cs6tt||}|jr2t|j|_|j|_|j|_|Sr?)rrtrr3rrrrr"r@rCr s  z_WriteQuery._clone_attributescsfdd}|S)Ncs0|jjj}|js tdt||f||S)Nz/RETURNING is not supported by your database: %s)rrrr5r|r)rAr r r%rDr@rCr s  z-_WriteQuery.requires_returning..innerr@)rDrr@rurCrequires_returning s z_WriteQuery.requires_returningcGs>t|dkr |ddkr d|_n|s.|jjj}|||_dSra)rr3rrrXrr?r@r@rC returning s  z_WriteQuery.returningTcCs ||_dSr?r r!r@r@rCr sz_WriteQuery.tuplescCs ||_dSr?r"r#r@r@rCr$ sz_WriteQuery.dictscCs:|jdk r.|jr|jtS|jr.|jtS|jtSr?)r3rrr%r&rr'r(rr@r@rCr% s    z_WriteQuery.get_result_wrappercCs2|}|j|jgif}||j|||_|jSr?)r%r3rrr)rArirKr@r@rC_execute_with_result_wrapper sz(_WriteQuery._execute_with_result_wrapper)T)T) rErFrGrrrvrrwrr$r%rxr%r@r@r"rCrt s    rtcs`eZdZdfdd ZfddZedddZedZd d Z d d Z d dZ ddZ Z S) UpdateQueryNcs ||_d|_tt||dSr?)r2r1rryr)rArrr"r@rCr szUpdateQuery.__init__cs(tt||}t|j|_|j|_|Sr?)rryrrr2r1rr"r@rCr s zUpdateQuery._clone_attributescCs ||_dSr?r1rAactionr@r@rC on_conflict szUpdateQuery.on_conflictrcCs||Sr?)rr6rr@r@rCr szUpdateQuery.sqlcCs@|jdk r|jdkr|S|jdk r,|jS|j|SdSr?r3rrxr rows_affectedrrr@r@rCr s  zUpdateQuery.executecCs |jjjjstdt|S)NzwUPDATE queries cannot be iterated over unless they specify a RETURNING clause, which is not supported by your database.)rrrr5r|rrrr@r@rCr s zUpdateQuery.__iter__cCst|Sr?rjrr@r@rCr szUpdateQuery.iterator)N)N)rErFrGrrrr}rrrrrrr%r@r@r"rCry s  rycseZdZdfdd ZddZfddZed Zed Ze dd d Z e dddZ e dddZ e ddZddZddZddZZS) InsertQueryNFcsftt||d|_|dk p$|dk |_d|_|dk r>||_n |pDig|_||_||_||_ d|_ dSr?) rrrr<_is_multi_row_insert_return_id_listr@r?r>_validate_fieldsr1)rArrrowsr&rvalidate_fieldsr"r@rCr s zInsertQuery.__init__c #s|jj}|jr |jfdd}|j}|j}|jD]}|}t}|D]B}|jrZ||||j krp|j |} n|} |||| <| | qH|r|D]} | |kr|| || <q|Vq2dS)Ncs|krtd|dS)Nz"%s" is not a recognized field.)r)r+ valid_fieldsr@rCvalidate_field sz.InsertQuery._iter_rows..validate_field) rrrr _default_dict_default_callablesr@rrr&r) rA model_metardefaults callablesrJ field_rowrrr+r@rrCrA s,      zInsertQuery._iter_rowscsTtt||}|j|_|j|_|j|_|j|_|j|_|j|_|j |_ |j |_ |Sr?) rrrr@r<rr?r>rrr1rr"r@rCr/ szInsertQuery._clone_attributesrz where clauseTcCs ||_dSr?)r<)rAupsertr@r@rCr> szInsertQuery.upsertcCs ||_dSr?rzr{r@r@rCr}B szInsertQuery.on_conflictcCs ||_dSr?)r)rAreturn_id_listr@r@rCrF szInsertQuery.return_id_listcCs|jjr|jr|jrdSdSNTF)rinsert_returningrrrr@r@rCrFJ s zInsertQuery.is_insert_returningcCs||Sr?)rrKrr@r@rCrQ szInsertQuery.sqlcCsPg}d}|j}|jD]*}t|j||j}|r||q|rH|S|SdSr?)rr@rrrr<rr)rAid_listlast_idrrr@r@rC_insert_with_loopT s   zInsertQuery._insert_with_loopcCs|jo"|jdko"|jdko"|jj }|r0|S|jdk rL|jdkrL|S|jdk r\|jS|}|js|jj r| }|j j }ddt ||D}|j j jr|S|dS|j||j S|jrttd|SdSdS)NcSsg|]\}}||qSr@)r)rKr+rr@r@rCrLw sz'InsertQuery.execute..rT)rr>r3r insert_manyrrrxrrrrrrrGrWlast_insert_idrrr itemgetterfetchall)rAinsert_with_looprpk_rowrK clean_datar@r@rCrd s8   zInsertQuery.execute)NNNNF)T)N)T)rErFrGrrArrrrqrrr}rrrFrrrr%r@r@r"rCr s(     rc@s$eZdZedZddZddZdS) DeleteQueryrcCs||Sr?)rrLrr@r@rCr szDeleteQuery.sqlcCs@|jdk r|jdkr|S|jdk r,|jS|j|SdSr?r~rr@r@rCr s  zDeleteQuery.executeN)rErFrGrrrrr@r@r@rCr sr IndexMetadata)rrrZrrjColumnMetadata)r data_typerrrjForeignKeyMetadata)r dest_table dest_columnrjc@s eZdZdS)PeeweeExceptionNrErFrGr@r@r@rCr src@s eZdZdS)r!Nrr@r@r@rCr! sc@s eZdZdS)rNrr@r@r@rCr sc@s eZdZdS)rNrr@r@r@rCr sc@s eZdZdS)r#Nrr@r@r@rCr# sc@s eZdZdS)r$Nrr@r@r@rCr$ sc@s eZdZdS)r%Nrr@r@r@rCr% sc@s eZdZdS)r,Nrr@r@r@rCr, sc@s eZdZdS)r-Nrr@r@r@rCr- sc@s eZdZdS)r2Nrr@r@r@rCr2 sc@s*eZdZdgZddZddZddZdS) ExceptionWrapper exceptionscCs ||_dSr?)r)rArr@r@rCr szExceptionWrapper.__init__cCsdSr?r@rr@r@rC __enter__ rVzExceptionWrapper.__enter__cCsH|dkr dS|j|jkrD|j|j}tr.|}n|j}t||||dSr?)rErPY26r rc)rAexc_type exc_value tracebacknew_typeexc_argsr@r@rC__exit__ s  zExceptionWrapper.__exit__N)rErFrGrrrrr@r@r@rCr srcseZdZfddZZS)_BaseConnectionLocalc s4tt|jf|d|_d|_d|_g|_g|_dSr)rrr autocommitclosedconn context_stack transactionsrr"r@rCr s z_BaseConnectionLocal.__init__)rErFrGrr%r@r@r"rCr src@s eZdZdS)_ConnectionLocalNrr@r@r@rCr src @s|eZdZdZeZddddgZdZdZdZ iZ dZ dZ dZ dZdZdZdZiZd ZgZdZdZdZdZdZdZeeeeeee e!e"d Z#d}d d Z$d dZ%ddZ&ddZ'ddZ(ddZ)ddZ*ddZ+ddZ,ddZ-dd Z.e/d!d"Z0e/d#d$Z1d%d&Z2d'd(Z3d)d*Z4d+d,Z5d-d.Z6d~d/d0Z7d1d2Z8d3d4Z9d5d6Z:d7d8Z;d9d:ZZ>d?d@Z?ddAdBZ@dCdDZAdEdFZBdGdHZCdIdJZDdKdLZEddMdNZFdOdPZGddQdRZHddSdTZIddUdVZJddWdXZKddYdZZLd[d\ZMdd]d^ZNdd_d`ZOddadbZPddcddZQddedfZRdgdhZSddidjZTddkdlZUddmdnZVddodpZWdqdrZXdsdtZYdudvZZdwdxZ[dydzZ\d{d|Z]dS)DatabaseFr7r8r9r<TrNr) ConstraintErrorrrr#r$r%r,r-r2c Ksni|_|rt|_nt|_|j|f|t|_||_||_ ||_ t |j |pRi|_ t |j |pdi|_ dSr?)connect_kwargsr_localrinit threadingLock _conn_lockr autorollback use_speedupsrrr) rAr threadlocalsrr&opsrrrr@r@rCr s  zDatabase.__init__cKs0|s||dk|_||_|j|dSr?) is_closedrryrrr)rArrr@r@rCr s  z Database.initcCs t|jSr?)rrrr@r@rCexception_wrapperszDatabase.exception_wrapperc Csd|jT|jrtd|2|j|jf|j|j_d|j_ | |jjW5QRXW5QRXdS)NzBError, database not properly initialized before opening connectionF) rry Exceptionr_connectrrrrrinitialize_connectionrr@r@rCconnects zDatabase.connectcCsdSr?r@rArr@r@rCrszDatabase.initialize_connectionc CsN|j>|jrtd|||jjd|j_W5QRXW5QRXdS)NzBError, database not properly initialized before closing connectionT)rryrr_closerrrrr@r@rCrs  zDatabase.closecCs:|jjr"|jjdj}|dk r"|S|jjr2||jjSr)rr connectionrrrrr@r@rCget_conn szDatabase.get_conncCs|jjSr?)rrrr@r@rCr)szDatabase.is_closedcCs |Sr?)rrrr@r@rC get_cursor,szDatabase.get_cursorcCs |dSr?)rrr@r@rCr/szDatabase._closecKstdSr?r)rArr r@r@rCr2szDatabase._connectcCst|j||_dSr?)rr)rGr&r@r@rCregister_fields5szDatabase.register_fieldscCst|j||_dSr?)rr)rGrr@r@rC register_ops9szDatabase.register_opscCsl|tkr|jrtStS|tkr"tS|tkr8|jr4tStS|t krN|jrJt St S|t krZt S|jrdtStSdSr?)r(rrrrfrr&rrr'rrrer)rA wrapper_typer@r@rCr%=s&    zDatabase.get_result_wrappercCs|jjr|jSdSr?)rrD lastrowid)rArrr@r@rCrOszDatabase.last_insert_idcCs|jSr?)rowcount)rArr@r@rCrSszDatabase.rows_affectedcCs||j|j|j|jSr?)compiler_classrrrrrr@r@rCrVs zDatabase.compilercCs|j||Sr?)rrr)rArr@r@rCr[szDatabase.executec Cst||f|d|}z|||p.dWn,tk r`|rZ|jrZ|YnX|rv|rv| W5QRX|Srp) loggerdebugrrrrget_autocommitrrollbackcommit)rArrrrr@r@rCr^s  zDatabase.execute_sqlcCsdSr?r@rr@r@rCbeginmszDatabase.begincCs|dSr?)rrrr@r@rCrpszDatabase.commitcCs|dSr?)rrrr@r@rCrsszDatabase.rollbackcCs ||j_dSr?)rr)rArr@r@rCset_autocommitvszDatabase.set_autocommitcCs |jjdkr||j|jjSr?)rrrrr@r@rCrys  zDatabase.get_autocommitcCs|jj|dSr?)rrrrA transactionr@r@rCpush_execution_context~szDatabase.push_execution_contextcCs|jjdSr?)rrrQrr@r@rCpop_execution_contextszDatabase.pop_execution_contextcCs t|jjSr?)rrrrr@r@rCexecution_context_depthsz Database.execution_context_depthcCs t||dS)N)with_transaction)ExecutionContext)rArr@r@rCexecution_contextszDatabase.execution_contextcCs|jj|dSr?)rrrrr@r@rCpush_transactionszDatabase.push_transactioncCs|jjdSr?)rrrQrr@r@rCpop_transactionszDatabase.pop_transactioncCs t|jjSr?)rrrrr@r@rCtransaction_depthszDatabase.transaction_depthcCst|Sr?rrr@r@rCrszDatabase.transactioncstfdd}|S)Nc s*||W5QRSQRXdSr?rrr rAr@rCrs z)Database.commit_on_success..innerr)rAr rr@rrCcommit_on_successszDatabase.commit_on_successcCs|js tt||Sr?) savepointsr savepointrAsidr@r@rCrszDatabase.savepointcCst|Sr?)_atomicrr@r@rCatomicszDatabase.atomiccCstdSr?rrArr@r@rC get_tablesszDatabase.get_tablescCstdSr?rrArjrr@r@rC get_indexesszDatabase.get_indexescCstdSr?rrr@r@rC get_columnsszDatabase.get_columnscCstdSr?rrr@r@rCget_primary_keysszDatabase.get_primary_keyscCstdSr?rrr@r@rCget_foreign_keysszDatabase.get_foreign_keyscCstdSr?r)rAseqr@r@rCsequence_existsszDatabase.sequence_existscCs|}|j|||Sr?)rrrw)rArrYqcr@r@rCrwszDatabase.create_tablecCst||ddS)N)r_)create_model_tables)rArrYr@r@rC create_tablesszDatabase.create_tablescsH|}t|ttfs"td|fdd|D}|j|||S)Nz=Fields passed to "create_index" must be a list or tuple: "%s"cs&g|]}t|trjj|n|qSr@rSr:rr&rUrr@rCrLsz)Database.create_index..)rrSrrr|rrz)rArr&rrfobjsr@rrCrzs zDatabase.create_indexcsH|}t|ttfs"td|fdd|D}|j|||S)Nz;Fields passed to "drop_index" must be a list or tuple: "%s"cs&g|]}t|trjj|n|qSr@rrUrr@rCrLsz'Database.drop_index..)rrSrrr|rr{)rArr&rYrrr@rrCr{s zDatabase.drop_indexcCs|}|j||||Sr?)rrrv)rArr+r rr@r@rCrvs zDatabase.create_foreign_keycCs"|jr|}|j||SdSr?) sequencesrrr|rArrr@r@rCr|szDatabase.create_sequencecCs|}|j||||Sr?)rrrx)rArr_r`rr@r@rCrxs zDatabase.drop_tablecCst|||ddS)N)r_r`)drop_model_tables)rArrYr`r@r@rC drop_tablesszDatabase.drop_tablescCs|}|j||||Sr?)rrry)rArrbr`rr@r@rCrys zDatabase.truncate_tablecCs"tt|D]}|||q dSr?)rrvry)rArrbr`rr@r@rCtruncate_tablesszDatabase.truncate_tablescCs"|jr|}|j||SdSr?)rrrr}rr@r@rCr}szDatabase.drop_sequencecCstt|td|SNrrEXTRACTrr4rArA date_fieldr@r@rCr?szDatabase.extract_datecCs t||Sr?)r DATE_TRUNCrr@r@rC truncate_dateszDatabase.truncate_datecCstdS)NzDEFAULT VALUESrrr@r@rCrEszDatabase.default_insert_clausecCsdS)NzSELECT 0 WHERE 0r@rr@r@rCrqszDatabase.get_noop_sqlcCstSr?)r;rr@r@rCr8szDatabase.get_binary_type)TTNNFT)NT)T)N)N)N)N)N)N)F)F)F)F)N)FF)FF)FF)FF)^rErFrGr.rrr3r distinct_on drop_cascader foreign_keysr)for_update_nowaitrrrr#rrreserved_tablesr5rrsubquery_delete_same_tabler=window_functionsr#rrr$r%r,r-r2rrrrrrrrrrrrrorrr%rrrrrrrrrrrrrrrrrrrrrrrrrrrrwrrzr{rvr|rxrryrr}r?r rErqr8r@r@r@rCr s                       rcseZdZeZddddZdZeo(ejdkZ dZ e j de j diZd Zd*fd d Zd dZddZddZd+ddZd,ddZd-ddZd.ddZd/ddZd0ddZd1d d!Zd2d"d#Zd$d%Zd&d'Zd(d)ZZS)3r6rr)rirr<F)rOrM rrGLOBrzINSERT OR REPLACE INTONcsF|pg|_|dd}|r*|jd|ftt|j|f||dS)N journal_mode)_pragmasrQrrr6r)rArpragmasr r rr"r@rCrs   zSqliteDatabase.__init__cKsJts tdtj|f|}d|_z||Wn|YnX|S)Nz&pysqlite or sqlite3 must be installed.)sqlite3r!risolation_level_add_conn_hooksr)rArr rr@r@rCrszSqliteDatabase._connectcCs8|||ddt|ddt|ddtdS)NrArN date_truncr) _set_pragmascreate_functionrrrrr@r@rCr&s zSqliteDatabase._add_conn_hookscCs<|jr8|}|jD]\}}|d||fq|dS)NzPRAGMA %s = %s;)rrrr)rArrpragmarar@r@rCr,s zSqliteDatabase._set_pragmasDEFERREDcCs|jd|dddS)NzBEGIN %sFrr)rA lock_typer@r@rCr3szSqliteDatabase.begincCs tddS)NzBSQLite does not support ALTER TABLE statements to add constraints.)r-)rArr+r r@r@rCrv6sz!SqliteDatabase.create_foreign_keycCs|dd}dd|DS)Nz