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@ /peewee.pyemitiszNullHandler.emitN)__name__ __module__ __qualname__rDr@r@r@rCr>hsr>ZpeeweeZ_metaclass_helper_cCs|t|fiSr?) _METACLASS_)metabaser@r@rCwith_metaclassssrK)rL)Callable)reducecCs t|tSr?) isinstancerO)cr@r@rC}rSprintcCst|dSNZraw_unicode_escape)bytesencodesr@r@rCrSrTcCs|j|k r|||dSr?) __traceback__with_traceback)tpvaluetbr@r@rCreraises  r`cCstj|tjddS)N )sysstdoutwriterYr@r@rCprint_s rez4def reraise(tp, value, tb=None): raise tp, value, tbzUnsupported python version.@BcCs&|jd|j|jddttS)Ngi) microsecondsZsecondsZdays_Mtr@r@rCrSrTcCs|Sr?) total_secondsrjr@r@rCrSrT)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@rCrSrTz"format_date_time..)datetimestrptime ValueError)r^formatsZ post_processZfmtr@r@rCrps rpcsTttgfdddd}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_keydfsmodelsZorderingseenr@rCrs   z&sort_models_topologically..dfscSs|jj|jjfSr?)rznamedb_table)mr@r@rCrSrTz+sort_models_topologically..T)keyreverse)setsortedlistreversed)rnamesrr@rrCrqs rqcCs|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)rZZctilZ unbalanced_ctZrequiredr@r@rCrrs6    rr)_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_LOOKUPSAssertionErrorrpSQLITE_DATETIME_FORMATSgetattrZ lookup_typeZdatetime_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_MAPPINGrrprstrftimerr@r@rC_sqlite_date_trunc&s   rcCst||tjdk Sr?)researchI)Zregexr^r@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) eqltZltegtZgtenerrrrrcCs|}|||Sr?)copyupdate)sourceZ overridesZmergedr@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)rAargskwargsrfuncr@rCinner}szreturns_clone..inner)Z call_localrrr@rrC 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)NotImplementedErrortyperErArrrr@rCrsznot_allowed..innerr@rr@rrC 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__r superr3 __setattr__rArr^ __class__r@rCr s zProxy.__setattr__) rErFrG__doc__r rrr rr  __classcell__r@r@rrCr3sc@s8eZdZeZd ddZddZddZedd Z dS) rNcCs(g|_|dk r$||_|j|dSr?)fieldslower_rel_model_name _unresolvedry)rAZrel_model_namer@r@rCrs zDeferredRelation.__init__cCs|j|||fdSr?)rr~)rAr}fieldrr@r@rC set_fieldszDeferredRelation.set_fieldcCs(|jD]\}}}||_|||qdSr?)r rel_model add_to_class)rArrrrr@r@rC set_modelszDeferredRelation.set_modelcCs>ttj}|D]*}|j|jkr||tj|qdSr?)rrrrrErrdiscard)Z model_clsZ unresolvedZdrr@r@rCresolves   zDeferredRelation.resolve)N) rErFrGrrrrr staticmethodrr@r@r@rCrs  c@seZdZdddZdS) _CDescriptorNcCs|dk rt|jS|Sr?)Entity_aliasrAinstanceZ instance_typer@r@rC__get__s z_CDescriptor.__get__)N)rErFrGr$r@r@r@rCrsrc@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)_negatedr!_bind_to _orderingrr@r@rCrsz Node.__init__NFcsfdd}|S)Ncs&p|j}rt|}t|||Sr?)rErsetattr)methodZ method_namerclsrr@rC decorators   zNode.extend..decoratorr@)r.rrr/r@r-rCextendsz Node.extendcCs t|Sr?)rrr@r@rC clone_baseszNode.clone_basecCs,|}|j|_|j|_|j|_|j|_|Sr?)r1r(r!r*r))rAinstr@r@rCrs z Node.clonecCs|j |_dSr?)r(rr@r@rC __invert__szNode.__invert__cCs ||_dSr?r!)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)r))rAZbtr@r@rCbind_tosz Node.bind_tocCs d|_dS)NZASCr*rr@r@rCascszNode.asccCs d|_dS)NDESCr8rr@r@rCdescsz Node.desccCs|Sr?)r9rr@r@rC__pos__sz Node.__pos__cCs|Sr?)r;rr@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@)rCrBrr@rArC_e szNode._eT)rBcCs$|dkrt|tjdSt|tj|Sr?)r>OPrrr?r@r@rC__eq__'sz Node.__eq__cCs$|dkrt|tjdSt|tj|Sr?)r>rErrr?r@r@rC__ne__+sz Node.__ne__cCst|tj|Sr?)r>rErr?r@r@rCin_=szNode.in_cCst|tj|Sr?)r>rErr?r@r@rCnot_in?sz Node.not_incCs |rt|tjdSt|tjdSr?)r>rErr)rAis_nullr@r@rCrJAsz Node.is_nullcCst|tjd|S)Nz%%%s%%r>rErr?r@r@rCcontainsEsz Node.containscCst|tjd|S)Nz%s%%rKr?r@r@rC startswithGszNode.startswithcCst|tjd|S)Nz%%%srKr?r@r@rCendswithIsz Node.endswithcCst|tjt|td|S)Nr)r>rErrr4)rAZlowZhighr@r@rCrKsz Node.betweencCst|tj|Sr?)r>rEr)rA expressionr@r@rCrMsz Node.regexpcCst|tj|Sr?)r>rErr?r@r@rCconcatOsz Node.concat)NF)N)F)T)LrErFrGrrrR _node_typer classmethodr0r1rrr3r6r7r9r;r<r=rDrEr__and__r__or__r__add__r__sub__r__mul__rZ__div__ __truediv__r__xor____radd____rsub____rmul__Z__rdiv__ __rtruediv____rand____ror____rxor__rFrGr__lt__r__le__r__gt__r__ge__r __lshift__r __rshift__r__mod__r__pow__rZbin_andrZbin_orrHrIrJrLrMrNrrrPr@r@r@rCr%sp                       r%cs,eZdZdZdZfddZddZZS)r7z2An unescaped SQL string, with optional parameters.sqlcs||_||_tt|dSr?)r^paramsr r7r)rAr^rjrr@rCrVsz SQL.__init__cCst|jf|jSr?)r7r^rjrr@r@rCr1[szSQL.clone_baserErFrGrrQrr1rr@r@rrCr7Rs cs4eZdZdZdZfddZddZddZZS) r z/A quoted-name or entity, e.g. "table"."column".entitycstt|||_dSr?)r r rpath)rArmrr@rCrcszEntity.__init__cCs t|jSr?)r rmrr@r@rCr1gszEntity.clone_basecCsttd|j|fSr?)r filterrmrr@r@rCrjszEntity.__getattr__) rErFrGrrQrr1rrr@r@rrCr _s  r csTeZdZdZdZedZfddZedddZ d d Z dd d Z ddZ Z S)FunczAn arbitrary SQL function call.r)countsumcs6||_||_|r||jknd|_tt|dSr')r argumentsr _no_coerce_coercer ror)rArrrrr@rCrrsz Func.__init__TcCs ||_dSr?)rt)rAcoercer@r@rCruxsz Func.coercecCst|jf|j}|j|_|Sr?)rorrrrt)rAresr@r@rCr1|szFunc.clone_baseNcCsJt|tr|dkr|}|dkr0t||d}n t|j}t|td|S)N) partition_byorder_byZOVER)rQr=__sql__r7r!r)rArwrxwindowrir@r@rCovers  z Func.overcsfdd}|S)Ncstf||Sr?)rorrrr@rCdecszFunc.__getattr__..decr@)rArr~r@r}rCrs zFunc.__getattr__)T)NNN)rErFrGrrQrrsrrrur1r{rrr@r@rrCroms   rocs.eZdZdZdZdfdd ZddZZS) r>z0A binary expression, e.g `foo + 1` or `bar < 7`.rOFcs*tt|||_||_||_||_dSr?)r r>rlhsrCr@flat)rArrCr@rrr@rCrs zExpression.__init__cCst|j|j|j|jSr?)r>rrCr@rrr@r@rCr1szExpression.clone_base)Frkr@r@rrCr>sr>cs.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?)r^adaptr r.r)rAr^rrr@rCrszParam.__init__cCst|j|jSr?)r.r^rrr@r@rCr1szParam.clone_base)Nrkr@r@rrCr.sc@seZdZdZdS) Passthrough passthroughN)rErFrGrQr@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)rrr rrrnodes)rArrrr@rCrs   zClause.__init__cCst|j}|j|_|j|_|Sr?)rrrrrArr@r@rCr1s zClause.clone_base) rErFrGrrQrrrr1rr@r@rrCrs  c@seZdZdZdZdS) CommaClausez5One or more Node objects joined by commas, no parens., N)rErFrGrrr@r@r@rCrsrc@seZdZdZdZdS)EnclosedClausezAOne or more Node objects joined by commas and enclosed in parens.TN)rErFrGrrr@r@r@rCrsrcs.eZdZdfdd ZddZddZZS) r=Ncs*tt|||_||_|jp"d|_dS)Nw)r r=rrwrxr!)rArwrxrr@rCrszWindow.__init__cCsPg}|jr$|ttdt|j|jrD|ttdt|jtt|S)Nz PARTITION BYORDER BY)rwr~rr7rrxr)rAZ over_clausesr@r@rCryszWindow.__sql__cCst|j|jSr?)r=rwrxrr@r@rCr1szWindow.clone_base)NN)rErFrGrryr1rr@r@rrCr=s cCs td|S)Nz CHECK (%s)r7)r^r@r@rCrscs(eZdZdZfddZddZZS)rz:A "django-style" filter expression, e.g. {'foo__eq': 'x'}.c stt|||_dSr?)r rrqueryrArrr@rCrsz DQ.__init__cCs tf|jSr?)rrrr@r@rCr1sz DQ.clone_base)rErFrGrrr1rr@r@rrCrs cs eZdZdZfddZZS) _StripParensrrcstt|||_dSr?)r rrr&)rAr&rr@rCrsz_StripParens.__init__)rErFrGrQrrr@r@rrCrsr JoinMetadata src_model dest_modelsrcdestr primary_keyr is_backrefr6 is_self_join is_expressionc@s:eZdZd ddZddZddZdd Zed d ZdS) JoinNcCsXt|tst|trdS|j||}|dk r6|dfS|j||}|dk rT|dfSdS)NNNFT)rQ SelectQueryrz rel_for_modelreverse_rel_for_model)rArrrfk_fieldr{r@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?)rQ ModelAliasr}r)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)rrrrQonr%r!r>ror7r FieldProxyrrzrrto_fieldrrr r) rArrZ join_aliasrZon_fieldrrrZ 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  1rZ_Join)rrrrc@s&eZdZddZdddZddZdS) FieldDescriptorcCs||_|jj|_dSr?)rratt_namerArr@r@rCrYszFieldDescriptor.__init__NcCs|dk r|j|jS|jSr?)_datagetrrr"r@r@rCr$]szFieldDescriptor.__get__cCs||j|j<|j|jdSr?)rr_dirtyryrAr#r^r@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.rrunknownFNc s||_||_||_||_||_||_||_||_| |_| |_ | |_ | |_ t j d7_ t j |_|jrhdpjd|jf|_d|_tt |dS)NrrLF)nullindexunique verbose_name help_text db_columndefaultchoicesrsequence constraintsschemar_field_counter_order _sort_key _is_boundr r) rArrrrrrrrrrrrrr@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})rArr2r@r@rCr1s* 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) rr}rrrsubtitlerz add_fieldr+rrrAr}rr@r@rCrs zField.add_to_classcCs |jjjSr?)r}rzdatabaserr@r@rC get_databaseszField.get_databasecCs|}||Sr?) get_db_fieldrcompilerget_column_type)rAZ 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@rAr^r@r@rCrusz Field.coercecCs|dkr |S||S)z5Convert the python value for storage in the database.Nrurr@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?)r r}rzrr)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_typeZ 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')) rrrr~r7rrrr0)rArddlr@r@rC__ddl__s z Field.__ddl__cCst|jd|jjSN.)hashrr}rErr@r@rC__hash__szField.__hash__) FFFNNNNNFNNN)F)rErFrGrrrrQrrr1rrrrrrurrrrrrrr@r@rrCrfs:  cs.eZdZdZdfdd ZfddZZS)r bareNcs$tt|j|||dk r ||_dSr?)r r rru)rArurrrr@rCrszBareField.__init__c stt|jfd|ji|S)Nru)r r r1rurArrr@rCr1szBareField.clone_base)N)rErFrGrrr1rr@r@rrCr sc@seZdZdZeZdS)r"intN)rErFrGrrrur@r@r@rCr"sc@seZdZdZdS)r bigintNrErFrGrr@r@r@rCr sc@seZdZdZdS)r5smallintNrr@r@r@rCr5scs eZdZdZfddZZS)r1rcsd|d<tt|j||dS)NTr)r r1rrrr@rCrszPrimaryKeyField.__init__)rErFrGrrrr@r@rrCr1scs eZdZdZfddZZS)_AutoPrimaryKeyFieldNcs4||jkrtdt||ftt|||dS)Nz%s must be named `%s`.) _column_namerwrr rrrrr@rCrs z!_AutoPrimaryKeyField.add_to_class)rErFrGrrrr@r@rrCrsrc@seZdZdZeZdS)rfloatN)rErFrGrrrur@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_roundrZDefaultContextroundingr rr)rArrrrrrrr@rCrs zDecimalField.__init__c s(tt|jf|j|j|j|jd|S)N)rrrr)r rr1rrrrrrr@rCr1s zDecimalField.clone_basecCs |j|jgSr?)rrrr@r@rCrszDecimalField.get_modifierscCsTtj}|s|dkr|S|dS|jrP|d|j }|j}|t|j||dS|S)Nrr)r)rDecimalrrrrZquantize)rAr^DZexprr@r@rCr"szDecimalField.db_valuecCs*|dk r&t|tjr|Stt|SdSr?)rQrrrrr@r@rCr,s zDecimalField.python_value)rrFN) rErFrGrrr1rrrrr@r@rrCr s  utf-8cCs*t|tr|St|tr"||St|Sr?)rQ unicode_type string_typedecode)rZencodingr@r@rCcoerce_to_unicode2s    rcs>eZdZdZd fdd ZfddZddZd d ZZS) rstringcs||_tt|j||dSr?) max_lengthr rr)rArrrrr@rCr<szCharField.__init__c stt|jfd|ji|S)Nr)r rr1rrrr@rCr1@s zCharField.clone_basecCs|jr|jgpdSr?)rrr@r@rCrEszCharField.get_modifierscCs t|pdSNrrr@r@rCruHszCharField.coerce)r) rErFrGrrr1rrurr@r@rrCr9s  cs eZdZdZfddZZS)r fixed_charcs tt||}|r|}|Sr?)r rrstriprrr@rCrNszFixedCharField.python_value)rErFrGrrrr@r@rrCrKsc@seZdZdZddZdS)r8textcCs t|pdSrrrr@r@rCruWszTextField.coerceN)rErFrGrrur@r@r@rCr8Tscs4eZdZdZeZfddZddZddZZ S)r blobcs0t|jjtr|jj|jtt|||Sr?) rQrzrr3r _set_constructorr r rrrr@rCr^szBlobField.add_to_classcCs||_dSr?)get_binary_type _constructor)rArr@r@rCr cszBlobField._set_constructorcCs,t|tr|d}t|tr(||S|SrV)rQrrX basestringr rr@r@rCrfs     zBlobField.db_value) rErFrGrbinary_constructr rr rrr@r@rrCr Zs  c@s eZdZdZddZddZdS)r<uuidcCs6t|tjr|jSzt|jWS|YSXdSr?)rQrUUIDhexrr@r@rCrps  zUUIDField.db_valuecCs&t|tjr|S|dkrdSt|Sr?)rQrrrr@r@rCrxs zUUIDField.python_valueN)rErFrGrrrr@r@r@rCr<mscsfdd}|S)Ncs|jjj|Sr?)r}rzr extract_dater date_partr@rCr~~sz_date_part..decr@)rr~r@rrC _date_part}s rcs.eZdZdZdfdd ZfddZZS)_BaseFormattedFieldNcs$|dk r||_tt|j||dSr?)rxr rr)rArxrrrr@rCrsz_BaseFormattedField.__init__c stt|jfd|ji|S)Nrx)r rr1rxrrr@rCr1s z_BaseFormattedField.clone_base)N)rErFrGrxrr1rr@r@rrCrsrc@sjeZdZdZdddgZddZeedZeedZ eed Z eed Z eed Z eed Z d S)rrurrrcCs|rt|trt||jS|Sr?)rQrrprxrr@r@rCrs zDateTimeField.python_valuerrrrrrN)rErFrGrrxrrrrrrrrrr@r@r@rCrs     c@sFeZdZdZdddgZddZeedZeedZ eed Z d S) rdaterrrcCs@|r$t|tr$dd}t||j|S|r.)rQrrprxrurrAr^Zppr@r@rCrs zDateField.python_valuerrrN) rErFrGrrxrrrrrrr@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?)rrsr@r@rCrSrTz(TimeField.python_value..)rQrrprxrurZ timedeltaminrr@r@rCrs  zTimeField.python_valuerrrN) rErFrGrrxrrrrrrr@r@r@rCr9s  csFeZdZddedDZfddZddZdd Zd d ZZ S) r:cCsg|] }d|qS)rr@.0rr@r@rC szTimestampField.cs|ddpd|_|j|jkrsz*TimestampField.__init__..utcFr)popr valid_resolutionsrwrr"ruZutcfromtimestampZ fromtimestamp_convZutcnowZnow setdefaultr r:r)rArrZ_dtZ_defaultrr@rCrs  zTimestampField.__init__cCs|jdkr|jStjSNr)r rr rr@r@rCrszTimestampField.get_db_fieldcCs|dkr dSt|tjrn4t|tjrr)rQrurrrrrroundr r"calendarZtimegmZ utctimetuplermktimeZ timetuple microsecond)rAr^Z timestampr@r@rCrs    zTimestampField.db_valuecCsp|dk rlt|tttfrl|dkr$dS|jdkrbd|j}t||j\}}||}||j|dS||S|S)Nrrrf)r+)rQrrlongr divmodr%replace)rAr^Zticks_to_microsecondZticksrhr@r@rCrs   zTimestampField.python_value) rErFrGrr$rrrrrr@r@rrCr:s  c@seZdZdZeZdS)rboolN)rErFrGrr/rur@r@r@rCrscs:eZdZdZfddZddZd ddZd d ZZS) RelationDescriptorzEForeign-key abstraction to replace a related PK with a related model.cs||_tt||dSr?)rr r0r)rArrrr@rCrszRelationDescriptor.__init__cCsn|j|j}|dk s"|j|jkrZ|j|jkrN|j|jj|k}||j|j<|j|jS|jjsj|jj|Sr?) rrr _obj_cacherrrrr)rAr#Zrel_idrr@r@rCget_object_or_ids   z#RelationDescriptor.get_object_or_idNcCs|dk r||S|jSr?)r2rr"r@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?) rQrrrrrrrr1rrry)rAr#r^Z orig_valuer@r@rCr"s    zRelationDescriptor.__set__)N) rErFrGrrr2r$rrr@r@rrCr0 s   r0c@s"eZdZdZddZdddZdS)ReverseRelationDescriptorzr?r@rrrrr@rCrIs zForeignKeyField.__init__c s2tt|jf|j||j|j|j|jd|S)N)rrAr>r?r@r) r r r1r_get_related_namer>r?r@rrrr@rCr1Ys zForeignKeyField.clone_basecCs t||jSr?)r0rrr@r@rC_get_descriptorcszForeignKeyField._get_descriptorcCst|Sr?)r6rr@r@rC_get_id_descriptorfsz"ForeignKeyField._get_id_descriptorcCst|Sr?)r3rr@r@rC_get_backref_descriptorisz'ForeignKeyField._get_backref_descriptorcCs.|jrt|jr||S|jp,d|jjjS)Nz%s_set)r<callabler}rzrrr@r@rCrBls z!ForeignKeyField._get_related_namecstjtr,fdd}j|dStjtrLjdS__jpfdj_jkrd7j st dd _ j _jdkrˆj_jdk rtjtstjj_n jj j_j jrtfdd }jjj jkr.|d njjj jkrH|d j jkr`|d njkrt|d tttjjd_j jj<jj jj<dS)Ncs|_dSr?)rrr)r}rrAr@rCrssz.ForeignKeyField.add_to_class..callbackz%s_idZ_idrrrAcs.|jdjjfjdt||dS)Nz%s.%s)rbackref obj_id_name)rrzrrAr )msgcontextr}rrIrAr@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)rQrr3r rrrr}rrrrrrzrrBrArrrrvalidate_backrefsrr{__dict__r+rCrDrErrel)rAr}rrrMr@rLrCrqsR              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. )rQrr1rr r rrr@rCrs  zForeignKeyField.get_db_fieldcs$t|jts|jStt|Sr?)rQrr1rr r rrr@rCrs  zForeignKeyField.get_modifierscCs |j|Sr?)rrurr@r@rCruszForeignKeyField.coercecCs t||jr|}|j|Sr?)rQr _get_pk_valuerrrr@r@rCrs zForeignKeyField.db_valuecCst||jr|S|j|Sr?)rQrrrrr@r@rCrs zForeignKeyField.python_value)NNNNN)rErFrGrr1rCrDrErBrrrrurrrr@r@rrCr Hs  @ c@sFeZdZdZdZddZddZdddZd d Zd d Z d dZ dS)rz+A primary key composed of multiple columns.NcGs ||_dSr?) field_names)rArRr@r@rCrszCompositeKey.__init__cCs||_||_t|||dSr?)rr}r+rr@r@rCrszCompositeKey.add_to_classcs$dk r tfdd|jDS|S)Ncsg|]}t|qSr@)rr field_namer#r@rCrsz(CompositeKey.__get__..)tuplerRr"r@rUrCr$s  zCompositeKey.__get__cCsdSr?r@rr@r@rCrszCompositeKey.__set__cs&fddtj|D}ttj|S)Ncs"g|]\}}jjj||kqSr@)r}rzr)rrr^rr@rCrsz'CompositeKey.__eq__..)ziprRrPoperatorand_)rAother expressionsr@rrCrFs  zCompositeKey.__eq__cCst|jj|jfSr?)rr}rErRrr@r@rCrszCompositeKey.__hash__)N) rErFrGrrrrr$rrFrr@r@r@rCrs c@sDeZdZdZdddZddZddd Zd d Zd d ZddZ dS)AliasMaprkrcCsi|_||_dSr?) _alias_map_counter)rAstartr@r@rCrszAliasMap.__init__cCs d|jS)Nzr]rr@r@rC__repr__szAliasMap.__repr__NcCs:||jkrdS|jd7_|p.d|j|jf|j|<dS)Nrz%s%s)r]r^prefix)rArr6r@r@rCrys z AliasMap.addcCs||jkr|||j|Sr?)r]ryrArr@r@rC __getitem__s  zAliasMap.__getitem__cCs ||jkSr?r`rcr@r@rC __contains__szAliasMap.__contains__cCs.|r*|jD]\}}||kr||j|<q|Sr?)r]items)rA alias_maprr6r@r@rCrs  zAliasMap.update)r)N) rErFrGrbrraryrdrerr@r@r@rCr\s  r\c2@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) QueryCompilerrZBIGINTZBLOBZSMALLINTZDATEZDATETIMEZDECIMALZREALZCHARINTEGERZVARCHARTEXTZTIME)rrr r/rrurrrrrrrrr rrrrrrrrzNOT 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)rArnrofield_overrides op_overridesr@r@rCrHs  zQueryCompiler.__init__c Cs2|j|j|j|j|j|j|j|j|j|j |j d S)N) rOrrrrrlrri select_querycompound_select_queryrr) _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@rCrtQszQueryCompiler.get_parse_mapcCsd|j||jfS)Nz%s%s%s)rn)rArZr@r@rCquotebszQueryCompiler.quotecCs||jkr|j|S|Sr?)rqupper)rAfr@r@rCreszQueryCompiler.get_column_typecCs |j|Sr?)rs)rAqr@r@rCget_ophszQueryCompiler.get_opcCst|dddS)NcSs |djSNr)r)rr@r@rCrSlrTz.QueryCompiler._sorted_fields..r)rrf)rA field_dictr@r@rC_sorted_fieldskszQueryCompiler._sorted_fieldscCs |j|gfSr?)rorAr&rgconvr@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)) rQrr parse_noder@rCrErrr) rAr&rgrrZlparamsr@Zrparamstemplaterir@r@rCr{qs zQueryCompiler._parse_expressioncCs*|jr|||j|dS|j|jgfSr?)rrr^rorr@r@rCr}|sz QueryCompiler._parse_passthroughcCs^|jr0|r|j|jkrd}|||j||S|dk rL|||j|S|j|jgfSdSr?)rrrr^rorr@r@rCr|szQueryCompiler._parse_paramcCs8|jr |p d}||j||\}}d|jt|f|fS)Nr)rtparse_node_listrrrrrrAr&rgrrirjr@r@rCr~szQueryCompiler._parse_funccCs2||j|||j\}}|jr*dt|}||fSN(%s))rrrrrrrr@r@rCrs zQueryCompiler._parse_clausecCsdt|j|jgfSr)rrrrmrr@r@rCrszQueryCompiler._parse_entitycCs|jt|jfSr?)r^rrjrr@r@rCrszQueryCompiler._parse_sqlcCs<|r(d|||j||jf}n ||j}|gfSr)rrr}r)rAr&rgrrir@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)NrzTFz((%s) %s (%s))r) r@rQralias_map_classr^generate_selectcalculate_alias_maprcompound_select_parenthesesrX)rAr&rgrZcsqZfirst_qZsecond_qrBnew_mapfirstZfirst_prZsecond_prZlprZrprir@r@rCrs*  z*QueryCompiler._parse_compound_select_querycCsV|}|js6|r$t|tr$|j}n |jjj}|f|_| ||\}}dt ||fSr) r_explicit_selectionrQr rr}rzr_selectrrr)rAr&rgrrZ select_fieldrrjr@r@rCrs z!QueryCompiler._parse_select_querycCs ||j||\}}t||fSr?)rr&rrrr@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)NrQFrT)rrurvrrQrrVrrr*ror rrrrQr r:rrr6r_parser) rAr&rgrZ node_typerrirjrr^rl_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@)rrrr@rCrsz,QueryCompiler.parse_node..zNOT %srAScss|]}t|tVqdSr?)rQr%)rpr@r@rCr!sz+QueryCompiler.parse_node..) rrQr%r(r!rr*any enumerater) rAr&rgrrirjrZ clean_paramsZ clean_sqlidxrZcsqlZcparamsr@rrCrs"  zQueryCompiler.parse_noderc CsFg}g}|D]*}||||\}} |||| q |||fSr?)rr~r0r) rArrgrrrirjr&Znode_sqlZ 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?) rr^ryr}rz table_alias_joinsrfrQrr%r6r)rArrgrrZ joined_modelsZjoin_objr@r@rCrs z!QueryCompiler.calculate_alias_mapcCs|t||Sr?)rr)rAclausesrgr@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)rr#ryrrQrr>rorr rr6rrrrrrrrwr%r~rrjoin_mapr7)rAjoinsr}rgrrrcurrrrr constraintrZfk_modelZpk_modelfkrr@Zdest_nrZjoin_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)NZSELECTzSELECT DISTINCT)TFrrFROMZWINDOWcSs&g|]}tt|jtd|qS)r)rr7r!ry)rrzr@r@rCr}s z1QueryCompiler.generate_select..WHEREzGROUP BYZHAVINGrzLIMIT %sz OFFSET %szFOR UPDATE NOWAITz FOR UPDATE)r}rzrrrQCompoundSelectr _distinctr7rrrrr0_fromr~rr6r_windowsrr_where _group_by_having _order_by_limit_offset limit_max _for_updater) rArrgrdbrZ select_clauseZ join_clauseslimit for_updateZno_waitZstmtr@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 %sZUPDATEZSETrFrT)rrr RETURNING)r}rryrzr _on_conflictr7rr_updaterQr%r*r.rr~r>rErrrr0 _returningrrr) rArrrg statementrrrr^returning_clauser@r@rCgenerate_updates2     zQueryCompiler.generate_updatecCs|dd|DS)NcSsg|]}|jddqS)Frrrrr@r@rCrsz3QueryCompiler._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 INTOFrrTrZVALUESr)rr)&r}rzrryr_upsertr upsert_sqlrr7r_query_fieldsr~rr_rows _iter_rowsrkeysrX attrgetterrQr%r*r.rrr0rauto_incrementdefault_insert_clauseis_insert_returningget_primary_key_fieldsrrrr)rArrrIrgrrrZ value_clausesZ have_fieldsrow_dictr|rr^rr@r@rCgenerate_insertsl           zQueryCompiler.generate_insertcCsf|j}td|g}|jr0|td|jg|jdk r\t|j}d|_|td|g||S)Nz DELETE FROMrrr) r}r7rrr0rrrr)rArrrrr@r@rCgenerate_deletes  zQueryCompiler.generate_deletecCs ||}||}t|Sr?)rrrr)rArrrr@r@rCfield_definition s zQueryCompiler.field_definitioncCsjtdt|td|jt|jg}|jrH|td|j|jrb|td|jt|S)Nz FOREIGN KEYZ REFERENCESz ON DELETE %sz ON UPDATE %s) r7rrrrr>r~r?r)rArrr@r@rCforeign_key_constraints  z$QueryCompiler.foreign_key_constraintcsfdd}|S)Ncst|}||||Sr?)rr)rArrr function_namer@rCr"s z/QueryCompiler.return_parsed_node..innerr@)rrr@rrCreturn_parsed_nodes z QueryCompiler.return_parsed_nodecCsN|pd|jj|j|jjjf}||}ttd|tdt|f|j S)Nzfk_%s_%s_refs_%sz ALTER TABLEzADD CONSTRAINT) rzrrrrrr7rr r)rAr}rrZ fk_clauser@r@rC_create_foreign_key's z!QueryCompiler._create_foreign_keyrFc 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@)rrrrrIr@rCr;sz/QueryCompiler._create_table..r)rz composite_keyrrRr~rr7rdeclared_fieldsrrQr r=rrr%r) rAr}safercolumnsrZpk_colsrrr@rrC _create_table5s2        zQueryCompiler._create_tablercCs6|rdnd}t||g}|r.|tdt|S)NzDROP TABLE IF EXISTSz DROP TABLECASCADEr7rr~r)rAr} fail_silentlycascaderrr@r@rC _drop_tablePs  zQueryCompiler._drop_tablercCs<td|g}|r"|td|r4|tdt|S)NzTRUNCATE TABLEzRESTART IDENTITYrr)rAr}restart_identityrrr@r@rC_truncate_tableXs zQueryCompiler._truncate_tablercCsRd|d|f}t|dkrNt|d}d|dd|ddf}|S)Nz%s_%sr@r7)rrhashlibZmd5rXZ hexdigest)rAtablerrZ 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@rrr@r@rCrlsz/QueryCompiler._create_index..rcSsg|] }|qSr@rrr@r@rCrrs)rzrrrr7r rr)rAr}rrr@tbl_namerrr@r@rC _create_indexis zQueryCompiler._create_indexrcCs<|jj}|rdnd}||dd|D}tt|t|S)NzDROP INDEX IF EXISTSz DROP INDEXcSsg|] }|jqSr@rrr@r@rCrysz-QueryCompiler._drop_index..)rzrrrr7r )rAr}rrrrrr@r@rC _drop_indexvs zQueryCompiler._drop_indexrcCsttdt|S)NzCREATE SEQUENCErr7r rAZ sequence_namer@r@rC_create_sequence}szQueryCompiler._create_sequencercCsttdt|S)Nz DROP SEQUENCErrr@r@rC_drop_sequenceszQueryCompiler._drop_sequencer)rlrmNN)NN)Nr)N)N)N)N)F)FF)FF)F)YrErFrGrprErrrrrrrrrrrrrrrrrrrrrrrrrrrr&rrrrrr\rrrtrrrrrr{r}r|r~rrrrrrrrrrrrrrrrrrrrrrrcreate_foreign_keyr create_tabler drop_tablertruncate_tablerr create_indexr drop_indexrcreate_sequencer drop_sequencer@r@r@rCrh s     '   5 ? >        rhc@seZdZdddZdS)SqliteQueryCompilerFcCs |Sr?)deleteri)rAr}rrr@r@rCrsz"SqliteQueryCompiler.truncate_tableN)FF)rErFrGrr@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~ StopIterationrcr@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)rArrrIr@r@rCrszQueryResultWrapper.__init__cCs|jrt|jSt|SdSr?)riterrrrr@r@rC__iter__s zQueryResultWrapper.__iter__cCs||jSr?) fill_cacherrr@r@rCrpszQueryResultWrapper.countcCs|jSr?)rprr@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 descriptionr$r"r@r@rCrs  zQueryResultWrapper.iterateccs|VqdSr?)rrr@r@rCiteratorszQueryResultWrapper.iteratorcCsh|j|jkr*|j|j}|jd7_|S|jr4t|}|j||jd7_|jd7_|Sr')rrrrrrr~)rAr2rr@r@rCrs   zQueryResultWrapper.nextcCs`|p td}|dkrtd|j|_|js\||jkr\z t|Wq$tk rXYq\Yq$Xq$dS)NZInfrz"Negative values are not supported.)rrwrrrrrrAnr@r@rCr s  zQueryResultWrapper.fill_cache)N)N)rErFrGrrrrrpr!r$rr(rrr r@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)rAr'Zn_colsrZn_metarr&r@r@rCrs    z ExtQueryResultWrapper.initializecCsH|jjj}||kr2||}|j||j|jfn|j||dfdSr?)rrzrrr~rr)rArrZ model_colsrr@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) rQrrr~r!rrrorrrrt)rAr&rargrrr@r@rCr, s   z&ExtQueryResultWrapper._initialize_nodeN)rErFrGrr-r,r@r@r@rCr+sr+c@seZdZddZdS)TuplesQueryResultWrappercstfddt|DS)Ncs8g|]0\}}j|ddkr"|nj|d|qS)rLNr)rrcolrr@rCr sz8TuplesQueryResultWrapper.process_row..)rVrr"r@rrCr$ s z$TuplesQueryResultWrapper.process_rowNrErFrGr$r@r@r@rCr/ sr/c@seZdZddZdS)NaiveQueryResultWrappercCsJ|}|jD].\}}}t|||dk r2|||n||q||Sr?)rrr+_prepare_instance)rAr#r#rcolumnrr@r@rCr$! s &z#NaiveQueryResultWrapper.process_rowNr1r@r@r@rCr2 sr2c@seZdZddZdS)DictQueryResultWrappercCs:i}|jD]*\}}}|dk r(|||n||||<q |Sr?r)rAr#rvrr4rr@r@rCr$, s"z"DictQueryResultWrapper.process_rowNr1r@r@r@rCr5+ sr5c@s>eZdZddZddZddZddZdd d Zd d Zd S)ModelQueryResultWrappercCs4|\|_}tdd|jD|_|||_dS)Ncss|]}t|tr|VqdSr?)rQr)rr0r@r@rCr!8 s z5ModelQueryResultWrapper.initialize..)generate_column_map column_maprr_col_setgenerate_join_list join_list)rAr'Z 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)rrrrrQrr _model_aliasfield_instancerr}r!rr)r%r rmr~ry) rAr8rrr&rrr constructorr@r@rCr7< 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') rrr#rrrrr9rrr~) rArr;rstackcurrentrr fk_present pk_presentZcheckr@r@rCr:X s2      z*ModelQueryResultWrapper.generate_join_listcCs.||}||}|D] }|q|dSr)construct_instances follow_joinsr3)rAr# collected instancesrr@r@rCr$u s    z#ModelQueryResultWrapper.process_rowNc Csi}t|jD]x\}\}}}}|dk r0||kr0q||} ||krJ|||<||} |dkrj|jj|d}t| ||dkr|| n|| q|Sr)rr8rr'r+) rAr#rZcollected_modelsrrr@rrr^r#r@r@rCrE| 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)rr;rrKeyErrorrrrrrrrrr+rr~) rArGpreparedrZ check_nullrCrDr2 joined_instZhas_fkZmpkZcan_populate_joined_pkZcan_populate_joined_fkr@r@rCrF sX      z$ModelQueryResultWrapper.follow_joins)N) rErFrGrr7r:r$rErFr@r@r@rCr65 s  r6 JoinCacherrcs8eZdZfddZfddZddZddZZS) AggregateQueryResultWrappercsg|_tt|j||dSr?)_rowr rOrrrr@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)NrNr@)r rOrr all_modelsr8ryZmodels_with_aggregateZback_referencessource_to_destZdest_to_sourcer;rrrArrrr&rrMr6columns_to_comparerr~rr0)rAr'rrrrrZkey_to_columnsrr}col_namerZsourcesZ joined_modelrr@rCr sL       z&AggregateQueryResultWrapper.initializecCsDi}|jD]0\}}g||<|D]\}}||||q"q|Sr?)rSrfr~)rAr#rr}Z column_datarrTr@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@)rrSrUr@rCr szHAggregateQueryResultWrapper.iterate.._get_pk..)rzrrVrrRrQrUr@rUrC_get_pk s  z4AggregateQueryResultWrapper.iterate.._get_pkF) rPr#rr%rrr&rrrr'rErrfrrUrryr~rQrr|rrRrrJrrr+rrr3)rAr#rVZ identity_mapZ _constructedZprimary_instancerr#Z model_dataZcur_rowZduplicate_modelsZ cur_row_datar}dataZdifferent_modelsZ new_instancesZall_noner^rArHrBrrrpkr2rLr@r@rCr s                        z#AggregateQueryResultWrapper.iterate)rErFrGrrrUrrr@r@rrCrO s  6rOcseZdZdZdZfddZddZddZd 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|_ dSrI) r rYrr}rzrr _query_ctxrrrAr}rr@rCrv s  zQuery.__init__cCs|\}}d|j||fS)Nr)rir}rArirjr@r@rCra s zQuery.__repr__cCs t||j}|j|_||Sr?)rr}r_clone_attributesrr@r@rCr sz Query.clonecCs,|jdk r|j|_||_|j|_|Sr?)rr _clone_joinsrrZrr@r@rCr] s    zQuery._clone_attributescCstdd|jDS)Ncss|]\}}|t|fVqdSr?)r)rZmcjr@r@rCr! sz%Query._clone_joins..)dictrrfrr@r@rCr^ szQuery._clone_joinsNcCs,ttj|}|dkr|S|p tj}|||Sr?)rPrXrY)rAinitialr[Z conjunctionZreducedr@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?) rQr%r~rYrr0get_proxy_fieldsr r:r*rzr)rAraccumr.r@r@rC_model_shorthand s     zQuery._model_shorthandcGs||j||_dSr?)rbrrAr[r@r@rCr5 sz Query.wherecGs||j|tj|_dSr?)rbrrXor_rfr@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.) rZrQrr rz rel_existsrwrrrr&r~r)rArrrrZrequire_join_conditionr@r@rCr s     z Query.joincCs|p|j|_dS)z"Change or reset the query context.N)r}rZr[r@r@rCswitch sz Query.switchcKsN|j}|j|gD]}|j|kr|Sq||j|fd|i||S)Nr)rZrrrrjr)rAlmrmrZ join_kwargsZctxrr@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 r3rrfr}rsplit DJANGO_MAPrErsplitrrQrr~r>) rAZqdictrdrZ relationshiprr^rrCpiece 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)rr5r@r@rCr sz Query.filter..rr@)r%rPrXrYrrrpopleftrQr>rr@rtrrr(r!r+r~rr r}rr3rrmr5)rArrZdq_noderZdq_joinsrZsiderrrrrOrrkrl field_objr@r@rCrn s>       z Query.filtercCs |jSr?)rrrr@r@rCr szQuery.compilercCstdSr?rrr@r@rCri sz Query.sqlcCs|\}}|j|||jSr?)rir execute_sqlrequire_commitr\r@r@rC_execute s zQuery._executecCstdSr?rwrr@r@rCexecute sz Query.executeFcCs6|r|}n |}|r.|s.|dS|SdSr)tuplesrrzr%)rAZas_tupleconvertr#r@r@rCscalar s  z Query.scalar)N)NN)N)N)FF)rErFrGrryrrarr]r^rbrerr5rhrrjrmrtrnrrirzr{r~rr@r@rrCrYr s2        (rYcsteZdZdZfddZddZedZedZedZ 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_dictsr rr)rArrrjrr@rCr% s  zRawQuery.__init__cCs*t|j|jf|j}|j|_|j|_|Sr?)rr}rrrrrr@r@rCr- szRawQuery.clonejoiningr5rjTcCs ||_dSr?rrAr|r@r@rCr|7 szRawQuery.tuplescCs ||_dSr?rrAdictsr@r@rCr; szRawQuery.dictscCs |j|jfSr?)rrrr@r@rCri? sz RawQuery.sqlcCsX|jdkrR|jr|jt}n |jr2|jt}n |jt}||j| d|_|jSr?) rrrget_result_wrapperRESULTS_TUPLESr RESULTS_DICTS RESULTS_NAIVEr}rz)rAZQRWr@r@rCr{B s  zRawQuery.executecCs t|Sr?rr{rr@r@rCrM szRawQuery.__iter__)T)T)rErFrGrrrrrr5rjrr|rrir{rrr@r@rrCr s    rcKs8|dd}|rtd|r,|p"g|p*dS|r4|SdS)Nr0Fz,"extend" is the only valid keyword argument.)r#rw)ZorigZnew_valrr0r@r@rC allow_extendP s rcseZdZdZfddZfddZddZeeZedZ 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)irrycstt|||jj|_|j|d|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_d|_d|_d|_dS)NF)FF)r rrr commit_selectry_SelectQuery__selectrrrrrrrrr_naiverr_aggregate_rowsr!r)rAr} selectionrr@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?)r rr]rrrrrQr%r~rrrrrrrrrrrrrr!)rArrrr@rCr]p s6           zSelectQuery._clone_attributescsfdd}|S)Ncs0|jjjj}|kr tdt|j||S)Nz!Your database does not support %s)r}rzrcompound_operationsrwr)rArZZ supported_opsrXr@rCr s  z&SelectQuery.compound_op..innerr@)rXrr@rrC compound_op s zSelectQuery.compound_opUNION INTERSECTEXCEPTcCs4|jtdt||@d}||B|S)Nrr)r}r4r7from_rr6rx)rAr@Z wrapped_rhsr@r@rCrY szSelectQuery.__xor__cCstd||S)N UNION ALL)r_compound_op_staticr?r@r@rC union_all szSelectQuery.union_allcGs,t|dk|_|p|jjj}|||_dSr)rrr}rzrrerrArr@r@rCZ__select szSelectQuery.__selectcGs|r t|nd|_dSr?)rr)rArr@r@rCr szSelectQuery.from_cOs|r||nd|_dSr?)rerrr@r@rCgroup_by szSelectQuery.group_bycGs||j||_dSr?)rbrrfr@r@rChaving szSelectQuery.havingcOst|jt|f||_dSr?)rrrrr@r@rCrx szSelectQuery.order_bycOst|jt|f||_dSr?)rrr)rAZwindowsrr@r@rCrz szSelectQuery.windowcCs ||_dSr?)r)rAZlimr@r@rCr szSelectQuery.limitcCs ||_dSr?)r)rAZoffr@r@rCoffset szSelectQuery.offsetcCs$|dkr|d8}||_|||_dSNrr)rr)rAZpageZ paginate_byr@r@rCpaginate szSelectQuery.paginateTcCs ||_dSr?)r)rAZ is_distinctr@r@rCdistinct szSelectQuery.distinctFcCs||f|_dSr?)r)rArZnowaitr@r@rCr szSelectQuery.for_updatecCs ||_dSr?)r)rAnaiver@r@rCr szSelectQuery.naivecCs ||_dSr?rrr@r@rCr| szSelectQuery.tuplescCs ||_dSr?rrr@r@rCr szSelectQuery.dictscCs ||_dSr?)r)rAaggregate_rowsr@r@rCr szSelectQuery.aggregate_rowsNcCs ||_dSr?r4)rAr6r@r@rCr6 szSelectQuery.aliascCsx|dkrt|jjd}|j|kr4||j}n|}| |j|}|j sbdd|j D|_ t |j |f|_ |S)NrpcSsg|] }|qSr@)r6)rrtr@r@rCr sz(SelectQuery.annotate..) rCountrzrr6rZrjr}rrmrrrV)rArZ annotationrr@r@rCannotate s zSelectQuery.annotatecCs*|dkrttd}|}|g|_|S)Nr)rrr7rxr)rA aggregationrr@r@rC _aggregate s zSelectQuery._aggregatecCs||j|dS)Nr})rr~)rArr}r@r@rC aggregate szSelectQuery.aggregatecCs4|js|js|js|jr$|j|dS|jddp2dS)N clear_limitFrr)rrrr wrapped_countrrArr@r@rCrp s zSelectQuery.countcCsJ|}|rd|_|_|\}}d|}|jj|f|}|pHdS)Nz+SELECT COUNT(1) FROM (%s) AS wrapped_selectr)rxrrrir}rawr~)rArrrirjwrappedZrqr@r@rCr s  zSelectQuery.wrapped_countcCs$|dd}tdg|_t|S)Nr1)rr7rr/r~rr@r@rCexists s  zSelectQuery.existscCsH|dd}zt|WStk rB|jd|YnXdS)Nrz:Instance matching query does not exist: SQL: %s PARAMS: %s)rrr{rr}rrirr@r@rCr s zSelectQuery.getrcCs<|}|||jd|}|r8|dkr4|dS|SdSNrr)r{r r)rAr*rvrr@r@rCpeek s  zSelectQuery.peekcCs"|j|kr||_d|_|j|dS)NT)r*)rrrr)r@r@rCr& s zSelectQuery.firstcCs||Sr?)rrrr@r@rCri, szSelectQuery.sqlcCsT|j}|jD]B}t|tr*|j|kr*dSt|tr |jdk r |j|kr dSq dS)NFT)r}rrQrr%r))rAr}r&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?) rrrrrrrrrrrRESULTS_AGGREGATE_MODELSRESULTS_MODELSrr@r@rC_get_result_wrapper< s    zSelectQuery._get_result_wrappercCsN|js|jdkrD|j}|}|}|||||_d|_|jS|jSdSr')rrr}rrrz)rAr}Z query_meta ResultWrapperr@r@rCr{H szSelectQuery.executecCs t|Sr?rrr@r@rCrS szSelectQuery.__iter__cCst|Sr?rr{r(rr@r@rCr(V szSelectQuery.iteratorcCsN|}t|tr|j}n|}|dk r:|dkr6|dnd}|||j|Sr)r{rQslicestopr r)rAr^rvrr@r@rCrdY s  zSelectQuery.__getitem__cCs t|Sr?)rr{rr@r@rCr!d szSelectQuery.__len__cCst|Sr?)idrr@r@rCrh szSelectQuery.__hash__)r)T)TF)T)T)T)T)N)N)N)NT)F)F)r)r)5rErFrGrQrr]rrrrTrSrVrYrrrr4rrrrxrzrrrrrrr|rrr6rrrrprrrrrrirrrr{rr(rdr!PY3rrr@r@rrCrY s|                           rc@s$eZdZddZddZddZdS)NoopSelectQuerycCs|jdfSNr@)r get_noop_sqlrr@r@rCril szNoopSelectQuery.sqlcCsdS)Nrr@rr@r@rCro szNoopSelectQuery.get_query_metacCs |jtSr?)rrrrr@r@rCrr sz#NoopSelectQuery._get_result_wrapperN)rErFrGrirrr@r@r@rCrk srcsPeZdZdZdfdd ZfddZddd Zd d Zd d ZddZ Z S)rrzNcs(||_||_||_tt||gdSr?)rrXr@r rr)rAr}rrXr@rr@rCrx szCompoundSelect.__init__cs,tt||}|j|_|j|_|j|_|Sr?)r rr]rrXr@rrr@rCr]~ s z CompoundSelect._clone_attributesFcCs |j|dS)Nr)rrr@r@rCrp szCompoundSelect.countcCs |jSr?)rrrr@r@rCr szCompoundSelect.get_query_metacCs|jo|jSr?)rrr@rr@r@rCr 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?)rrrrrrrrrrr@rrrr)rAZ has_joinsZis_naiver@r@rCr s    z"CompoundSelect._get_result_wrapper)NNN)F) rErFrGrQrr]rprrrrr@r@rrCru s  rcsteZdZfddZfddZddZeeddZeedd d Zeedd d Z ddZ ddZ Z S) _WriteQuerycs,d|_d|_d|_d|_tt||dSr')rrrrr rrr[rr@rCr s z_WriteQuery.__init__cs6tt||}|jr2t|j|_|j|_|j|_|Sr?)r rr]rrrrrrr@rCr] s  z_WriteQuery._clone_attributescsfdd}|S)Ncs0|jjj}|js tdt||f||S)Nz/RETURNING is not supported by your database: %s)r}rzrrrwr)rArrrr,r@rCr s  z-_WriteQuery.requires_returning..innerr@)r,rr@rrCrequires_returning s z_WriteQuery.requires_returningcGs>t|dkr |ddkr d|_n|s.|jjj}|||_dSr)rrr}rzrrerr@r@rC returning s  z_WriteQuery.returningTcCs ||_dSr?rrr@r@rCr| sz_WriteQuery.tuplescCs ||_dSr?rrr@r@rCr sz_WriteQuery.dictscCs:|jdk r.|jr|jtS|jr.|jtS|jtSr?)rrrrrrrrrr@r@rCr s    z_WriteQuery.get_result_wrappercCs2|}|j|jgif}||j|||_|jSr?)rrr}rzr)rArrIr@r@rC_execute_with_result_wrapper sz(_WriteQuery._execute_with_result_wrapper)T)T) rErFrGrr]rrrr|rrrrr@r@rrCr s    rcs`eZdZdfdd ZfddZedddZedZd d Z d d Z d dZ ddZ Z S) UpdateQueryNcs ||_d|_tt||dSr?)rrr rr)rAr}rrr@rCr szUpdateQuery.__init__cs(tt||}t|j|_|j|_|Sr?)r rr]r`rrrrr@rCr] s zUpdateQuery._clone_attributescCs ||_dSr?rrAactionr@r@rC on_conflict szUpdateQuery.on_conflictrcCs||Sr?)rrrr@r@rCri szUpdateQuery.sqlcCs@|jdk r|jdkr|S|jdk r,|jS|j|SdSr?rrrr rows_affectedrzrr@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.)r}rzrrrwrr{rr@r@rCr s zUpdateQuery.__iter__cCst|Sr?rrr@r@rCr( szUpdateQuery.iterator)N)N)rErFrGrr]rrrrrir{rr(rr@r@rrCr s  rcseZdZdfdd ZddZfddZed Zed Ze dd d Z e dddZ e dddZ e ddZddZddZddZZS) InsertQueryNFcsftt||d|_|dk p$|dk |_d|_|dk r>||_n |pDig|_||_||_||_ d|_ dSr') r rrr_is_multi_row_insert_return_id_listrrr_validate_fieldsr)rAr}rrowsrrvalidate_fieldsrr@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.)rJ)r valid_fieldsr@rCvalidate_field sz.InsertQuery._iter_rows..validate_field) r}rzrr _default_dict_default_callablesrrrrry) rAZ model_metardefaultsZ callablesrZ field_rowrrrr@rrCr s,      zInsertQuery._iter_rowscsTtt||}|j|_|j|_|j|_|j|_|j|_|j|_|j |_ |j |_ |Sr?) r rr]rrrrrrrrrrr@rCr]/ szInsertQuery._clone_attributesrz where clauseTcCs ||_dSr?)r)rAupsertr@r@rCr> szInsertQuery.upsertcCs ||_dSr?rrr@r@rCrB szInsertQuery.on_conflictcCs ||_dSr?)r)rAreturn_id_listr@r@rCrF szInsertQuery.return_id_listcCs|jjr|jr|jrdSdSNTF)rinsert_returningrrrr@r@rCrJ s zInsertQuery.is_insert_returningcCs||Sr?)rrrr@r@rCriQ szInsertQuery.sqlcCsPg}d}|j}|jD]*}t|j||j}|r||q|rH|S|SdSr?)rrrr}rrr{r~)rAZid_listZlast_idrr#r@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)rrr4r@r@rCrw sz'InsertQuery.execute..rT)rrrr insert_manyrrrrzrr%r}rzrWrrlast_insert_idrrrX itemgetterfetchall)rAZinsert_with_looprZpk_rowrIZ clean_datar@r@rCr{d s8   zInsertQuery.execute)NNNNF)T)N)T)rErFrGrrr]rrr5rrrrrrrirr{rr@r@rrCr s(     rc@s$eZdZedZddZddZdS) DeleteQueryrcCs||Sr?)rrrr@r@rCri szDeleteQuery.sqlcCs@|jdk r|jdkr|S|jdk r,|jS|j|SdSr?rrr@r@rCr{ s  zDeleteQuery.executeN)rErFrGrrrir{r@r@r@rCr sr IndexMetadata)rrirrrColumnMetadata)rZ data_typerrrForeignKeyMetadata)r4 dest_table dest_columnrc@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__ rTzExceptionWrapper.__enter__cCsH|dkr dS|j|jkrD|j|j}tr.|}n|j}t||||dSr?)rErPY26rr`)rAexc_type exc_value tracebackZnew_typeZexc_argsr@r@rC__exit__ s  zExceptionWrapper.__exit__N)rErFrGr rrrr@r@r@rCr srcseZdZfddZZS)_BaseConnectionLocalc s4tt|jf|d|_d|_d|_g|_g|_dSrI)r rr autocommitclosedconn context_stack transactionsrrr@rCr s z_BaseConnectionLocal.__init__)rErFrGrrr@r@rrCr 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)DatabaseFrrrrTrmNrl) ZConstraintErrorrrr#r$r%r,r-r2c Ksni|_|rt|_nt|_|j|f|t|_||_||_ ||_ t |j |pRi|_ t |j |pdi|_ dSr?)connect_kwargsr_localrinit threadingZLock _conn_lockr autorollback use_speedupsrrwrx) rArZ threadlocalsrropsrrrr@r@rCr s  zDatabase.__init__cKs0|s||dk|_||_|j|dSr?) is_closedr&r=rrr)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) rr= Exceptionr _connectrrrrrinitialize_connectionrr@r@rCconnects zDatabase.connectcCsdSr?r@rArr@r@rCr szDatabase.initialize_connectionc CsN|j>|jrtd|||jjd|j_W5QRXW5QRXdS)NzBError, database not properly initialized before closing connectionT)rr=r r _closerrrrr@r@rCr&s  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?)r&rr@r@rCr/szDatabase._closecKstdSr?rw)rArrr@r@rCr 2szDatabase._connectcCst|j||_dSr?)rrw)r.rr@r@rCregister_fields5szDatabase.register_fieldscCst|j||_dSr?)rrx)r.rr@r@rC register_ops9szDatabase.register_opscCsl|tkr|jrtStS|tkr"tS|tkr8|jr4tStS|t krN|jrJt St S|t krZt S|jrdtStSdSr?)rrrr2rr6rrr/rrr5rrO)rAZ wrapper_typer@r@rCr=s&    zDatabase.get_result_wrappercCs|jjr|jSdSr?)rzrZ lastrowid)rArrr@r@rCrOszDatabase.last_insert_idcCs|jSr?)Zrowcount)rArr@r@rCrSszDatabase.rows_affectedcCs||j|j|j|jSr?)compiler_classrnrorwrxrr@r@rCrVs zDatabase.compilercCs|j||Sr?)rxrr)rArr@r@rCr{[szDatabase.executec Cst||f|d|}z|||p.dWn,tk r`|rZ|jrZ|YnX|rv|rv| W5QRX|Sr) loggerdebugr rr{r get_autocommitrrollbackcommit)rArirjryrr@r@rCrx^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?)rrr~rA transactionr@r@rCpush_execution_context~szDatabase.push_execution_contextcCs|jjdSr?)rrr#rr@r@rCpop_execution_contextszDatabase.pop_execution_contextcCs t|jjSr?)rrrrr@r@rCexecution_context_depthsz Database.execution_context_depthcCs t||dS)N)with_transaction)ExecutionContext)rAr#r@r@rCexecution_contextszDatabase.execution_contextcCs|jj|dSr?)rrr~rr@r@rCpush_transactionszDatabase.push_transactioncCs|jjdSr?)rrr#rr@r@rCpop_transactionszDatabase.pop_transactioncCs t|jjSr?)rrrrr@r@rCtransaction_depthszDatabase.transaction_depthcCst|Sr?rrr@r@rCrszDatabase.transactioncstfdd}|S)Nc s*||W5QRSQRXdSr?r)r|rrAr@rCrs z)Database.commit_on_success..innerr)rArrr@r*rCcommit_on_successszDatabase.commit_on_successcCs|js tt||Sr?) savepointsr savepointrAsidr@r@rCr-szDatabase.savepointcCst|Sr?)_atomicrr@r@rCatomicszDatabase.atomiccCstdSr?rwrArr@r@rC get_tablesszDatabase.get_tablescCstdSr?rwrArrr@r@rC get_indexesszDatabase.get_indexescCstdSr?rwr4r@r@rC get_columnsszDatabase.get_columnscCstdSr?rwr4r@r@rCget_primary_keysszDatabase.get_primary_keyscCstdSr?rwr4r@r@rCget_foreign_keysszDatabase.get_foreign_keyscCstdSr?rw)rAseqr@r@rCsequence_existsszDatabase.sequence_existscCs|}|j|||Sr?)rrxr)rAr}rqcr@r@rCrszDatabase.create_tablecCst||ddS)N)r)create_model_tables)rArrr@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@rQrrzrrr}r@rCrsz)Database.create_index..)rrQrrVrwrxr )rAr}rrr;fobjsr@r?rCr s 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@r>rr?r@rCrsz'Database.drop_index..)rrQrrVrwrxr )rAr}rrr;r@r@r?rCr s zDatabase.drop_indexcCs|}|j||||Sr?)rrxr)rAr}rrr;r@r@rCrs zDatabase.create_foreign_keycCs"|jr|}|j||SdSr?) sequencesrrxr rAr9r;r@r@rCr szDatabase.create_sequencecCs|}|j||||Sr?)rrxr)rAr}rrr;r@r@rCrs zDatabase.drop_tablecCst|||ddS)N)rr)drop_model_tables)rArrrr@r@rC drop_tablesszDatabase.drop_tablescCs|}|j||||Sr?)rrxr)rAr}rrr;r@r@rCrs zDatabase.truncate_tablecCs"tt|D]}|||q dSr?)rrqr)rArrrrr@r@rCtruncate_tablesszDatabase.truncate_tablescCs"|jr|}|j||SdSr?)rArrxr rBr@r@rCr szDatabase.drop_sequencecCstt|td|SNrrZEXTRACTrr4rArZ date_fieldr@r@rCrszDatabase.extract_datecCs t||Sr?)rZ DATE_TRUNCrHr@r@rC truncate_dateszDatabase.truncate_datecCstdS)NzDEFAULT VALUESrr[r@r@rCrszDatabase.default_insert_clausecCsdS)NzSELECT 0 WHERE 0r@rr@r@rCrszDatabase.get_noop_sqlcCstSr?)rrr@r@rCr szDatabase.get_binary_type)TTNNFT)NT)T)N)N)N)N)N)N)F)F)F)F)N)FF)FF)FF)FF)^rErFrGrrhrrr distinct_on drop_cascaderw foreign_keysrfor_update_nowaitrrrorrxrnreserved_tablesrr,rAsubquery_delete_same_tablerwindow_functionsr#rrr$r%r,r-r2rrrr rr r&rr rrr rRrrrrrrr{rxrrrrrr r!r"r%r&r'r(rr+r-r1r3r5r6r7r8r:rr=r r rr rrDrrEr rrIrrr r@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)3r6rirj)r/rrF)rMr rr=ZGLOBrzINSERT OR REPLACE INTONcsF|pg|_|dd}|r*|jd|ftt|j|f||dS)N journal_mode)_pragmasr#r~r r6r)rArZpragmasrrrRrr@rCrs   zSqliteDatabase.__init__cKsJts tdtj|f|}d|_z||Wn|YnX|S)Nz&pysqlite or sqlite3 must be installed.)sqlite3r!risolation_level_add_conn_hooksr&)rArrrr@r@rCr szSqliteDatabase._connectcCs8|||ddt|ddt|ddtdS)NrrLZ date_truncr) _set_pragmasZcreate_functionrrrrr@r@rCrV&s zSqliteDatabase._add_conn_hookscCs<|jr8|}|jD]\}}|d||fq|dS)NzPRAGMA %s = %s;)rSrr{r&)rArrZpragmar^r@r@rCrW,s zSqliteDatabase._set_pragmasDEFERREDcCs|jd|dddS)NzBEGIN %sFryrx)rAZ lock_typer@r@rCr3szSqliteDatabase.begincCs tddS)NzBSQLite does not support ALTER TABLE statements to add constraints.)r-)rAr}rrr@r@rCr6sz!SqliteDatabase.create_foreign_keycCs|dd}dd|DS)Nz