U aJ@s$dZddlZddlZddlmZddlmZddlmZddlmZdd lmZdd lm Z e d d Z d dZ d9ddZ ddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd:d'd(Zd;d)d*ZGd+d,d,ejZd-d.Zd/d0Zd1d2Zd3d4Zd5d6Z d7d8Z!dS)Cs  z$_get_crud_params..rc3s"|]}|kr|tfVqdSNr rkey)_column_as_keyspdrr ]sz#_get_crud_params..c3s|]}|tfVqdSrrrrrrrcsc3s|]\}}|VqdSrr)rkvrrrrszUnconsumed column names: %sz, css|]}d|fVqdS)z%sNrrrrrrsDEFAULT)$ postfetchinsert_prefetchupdate_prefetch returning_key_getters_for_crud_columnZ column_keysZ_no_parameterstablecolumns_has_multi_parameters_multi_parameterslistitemsZ_ordered_valuesZ_dict_parametersdict!_get_stmt_parameter_tuples_paramsisupdateZ is_multitable_get_multitable_paramsisinsert _select_names_scan_insert_from_select_cols _scan_colsset intersection differencer CompileErrorjoin_extend_values_for_multiparamsfor_executemanydialectZsupports_default_metavaluer r ) rstmt compile_statekw_getattr_col_key_col_bind_nameZgettersstmt_parameter_tuples parametersvalues check_columnscheckr)rrrr_get_crud_params%s              rFTFcKs>|dkr|j}tj|||j|d}d|_|r:|j|f|}|S)N)type_r T)rr BindParametertypeZ_is_crud_compiler_dispatch)rcolvalueprocessr namer> bindparamrrrrsrcKsRd|k}|s0|jr0t|jtjr0||jd|jf<|jjrD||j}|j |f|S)NZ visiting_cterO) unique isinstancerrZ_truncated_labelZtruncated_namesrI_isnull_with_binary_element_typerJ)rrKrLrNr>Zis_cterrr_handle_values_anonymous_params  rTcsv|jrN|jrNt|jttjtjfdd}fdd}fdd}nttjtj}t d}}|||fS)Ncs0|}t|dr(|jkr(|jj|fS|SdS)Nr&)hasattrr&rN)rZstr_key_etZ c_key_rolerrrs z4_key_getters_for_crud_column.._column_as_keycs"|jkr|jj|jfS|jSdSrr&rNrrKrWrrr?s z6_key_getters_for_crud_column.._getattr_col_keycs&|jkrd|jj|jfS|jSdS)Nz%s_%srXrYrZrrr@s z4_key_getters_for_crud_column.._col_bind_namer) r. _extra_fromsr4 functoolspartialrZ expect_as_keyr DMLColumnRoleoperator attrgetter)rr<r=rr?r@rrVrr%s   r%c st||\} } } } fddjD}j|_g}jrjt|}jjD]}||krL|jrL| |qL|D]P}||}||kr||kr| || ||j |dfqnt |||| qn|r|||j|_t|jjtdd|D|j_dS)Ncsg|]}jj|qSr)r&r)rrNrr<rrr7sz1_scan_insert_from_select_cols..css|]\}}}|VqdSrr)rrKcol_exprexprrrrrQsz0_scan_insert_from_select_cols..)_get_returning_modifiersr1selectZ_insert_from_selectZ#include_insert_from_select_defaultsr4r&r'defaultappendpopr r &_append_param_insert_select_hasdefaultextendZ _generatetupleZ _raw_columns)rr<r=rBr?rr@rDrCr>need_pksimplicit_returningimplicit_return_defaultspostfetch_lastrowidcolsZadd_select_colsZcol_setrKrcol_keyrrarr2#sD      r2c  st||\} } } } |jr`fdd|jD}t|fdd|DfddjjD}njj}|D]4}||}||kr||krt||||||| | || ql|jr|jr| r| rt |||| nt |||| n|j dk rt ||| || n|j dk rB| r,|| kr,|j|n|js|j|nD| r`|| kr`|j|n&|jr|jjk r|jst|ql|jrlt|||| || qldS)Ncsg|] }|qSrrrrrrrhsz_scan_cols..cs0g|](}t|tjr|jjkrjj|qSr)rQr string_typesr&rr)r<rrrls csg|]}|jkr|qSr)rr) ordered_keysrrrps )rdZ_parameter_orderingr4r&rr'_append_param_parameterr0 primary_key!_append_param_insert_pk_returning$_append_param_insert_pk_no_returningrf_append_param_insert_hasdefaultserver_defaultr$rgr!_autoincrement_columnnullable"_warn_pk_with_no_anticipated_valuer._append_param_update)rr<r=rBr?rr@rDrCr>rlrmrnroZparameter_orderingrprrqr)rrsr<rr3Ts          r3c Cs8||} |jj||jd} t| r\t||| f| tk|jsD||n d||d| } n| j rt ||| fd|js|||n d||i| } n|j | f| } |j r|r||kr|j|n |j|nR|jr|r|j|n|jjrd|_n*|r||kr|j|n |j|| || | fdS)NZ use_tablez%s_m0r rNrNT)rhr r include_table_with_column_exprsr _is_literalrr r(_is_bind_parameterrTrM self_groupr.r$rgr!rur;ro) rr<r=rrqrBr@rmrnrCr>rL col_valuerrrrtsX          rtcCs|jdk r|jjr\|jjrN|jjr*|jjsN|||j||j |jf|f|j |q|jj r|||j||j |jj f|f|j |q|||j|t||f|fn2||jjks|jdk r|j |n|jst|dS)zCreate a primary key expression in the INSERT statement where we want to populate result.inserted_primary_key and RETURNING is available. N)rf is_sequencer;supports_sequencesoptionalsequences_optionalrgr r rMr$is_clause_elementargr"_create_insert_prefetch_bind_paramr&rzryr{r|rr<rrCr>rrrrvs@     rvcCs|jdk r*|jjrj|jjr*|jjrj|jjrj||jjkr|jjs|jdk rX|jjrX|jjsj|jdkr|jj r| ||j |t ||f|fn>|jdkr|jdkr|js||jjk rt|n|jjrd|_dS)aoCreate a primary key expression in the INSERT statement where we want to populate result.inserted_primary_key and we cannot use RETURNING. Depending on the kind of default here we may create a bound parameter in the INSERT statement and pre-execute a default generation function, or we may use cursor.lastrowid if supported by the dialect. NT)rfrr;rrrr&rzroZ"preexecute_autoincrement_sequencesrgr r rryr{r|rrrrrwEsR   !"(    rwcCs|jjrr|jjr|jjr |jjs|||j||j |jf|f|r^||kr^|j |q|j s|j |n|jj r|||j||j |jjf|f|r||kr|j |q|j s|j |n"|||j|t||f|fdSr)rfrr;rrrrgr r rMr$rur!rrrr)rr<rrnrCr>rrrrxsB      rxcCs|jjr@|jjr|jjr |jjs|||j||j fnT|jj rj|||j||jj fn*|||j|t ||fddi|fdS)NrMF)rfrr;rrrrgr r Z next_valuerrrrrrrrris4 ricCs|j}|jdk r|jjs|jjrv|||jj||d|j|jj f|f|rh||krh|j |q|j |q|||jj||dt ||f|fnV|j dk r|r||kr|j |q|j |n$|r|js|js||kr|j |dS)Nr~)ronupdaterrrgr r rMrrr$r!"_create_update_prefetch_bind_paramserver_onupdate_return_defaults_columns_return_defaults)rr=r<rrnrCr> include_tablerrrr}sJ    r}cKs*t||df||d|}|j||SN)rMrN)rr"rgrrrMrNr>paramrrrrs rcKs*t||df||d|}|j||Sr)rr#rgrrrrr s rc@s0eZdZdZddZddZddZdd Zd S) _multiparam_columnTcCs4||_d|j|df|_||_|j|_|j|_dS)N%s_m%dr)indexroriginalrfrI)selfrrrrr__init__s z_multiparam_column.__init__cKs tdSrNotImplementedErrorrotherr>rrrcompare sz_multiparam_column.comparecKs tdSrrrrrr_copy_internals#sz"_multiparam_column._copy_internalscCs"t|to |j|jko |j|jkSr)rQrrr)rrrrr__eq__&s    z_multiparam_column.__eq__N)__name__ __module__ __qualname__Z_is_multiparam_columnrrrrrrrrrs rcCs|jstd|nh|jjr4|j|jjf|S|jjrL|j|jf|St||}t |t j rpt ||f|St ||f|SdS)NzINSERT value for column %s is explicitly rendered as a boundparameter in the VALUES clause; a Python-side value or SQL expression is required)rfrr7rrMrrrrrQrZInsertrr)rr<rrr>rKrrr _process_multiparam_default_bind.s   rc  Cstdd|D} |j} t} |jD]} | jD]} | | kr.| | | ||| <| | }|j| | d}t|rt || |f|t k|| d|}nB|j rt || |fd|| i|}n|j | |j|f|}|| ||fq.q$| D]} | jD]} | | kr qq| jdk r| jjs| jjrd|| |j| | d|j| jjf|f|j | n0|| |j| | dt|| fd|| i|fq| jdk r|j | qqdS)Ncss$|]\}}ttj||fVqdSr)rexpectrr^)rrrrrrrTsz)_get_multitable_params..rrrN)r,rr4r[raddrMrrrr rrTr!rgrrrrrrr)rr<r=rArDr@r?rCr>Znormalized_paramsrZaffected_tablestrrLrrrrr/Is               r/c Cs|}|g}t|jddD]\}}g}|D]\} } } | |ksH| j|kr| |krT| n| j} t|| rt|| || fdd| j|dfi|} q|j|| f|} nt||| ||} | | | | fq,| |q|S)NrrNr) enumerater)rrrrrMrrrg)rr<r=rCr>Zvalues_0irow extensionrKrbrr new_paramrrrr9s8 r9c Cs|D]\}}||} | dk r*|| |q|j||jd} t|rb|jtjd||jdf|}n,|jr||jj r|| |j}|j| f|}| || |fqdS)Nr)rG) setdefaultrMrrrrrHrIrrRrSrrg) rr=rBrArrCr>rrZcolkeyrbrrrr-s$    r-cCs|jo2|j o2|j s$|jjo2|jo2|j o2|j }|oF|jjoF|j j}|jrZ|oV|j}n"|j rx|jjot|j jot|j}nd}|r|j st |j j }n t |j }|o|jj}||||fS)NF)r0Z_inliner:r;Zinsert_executemany_returningrZ _returningr(rmr&r.rr4rro)rr<r=rlrmrnrorrrrdsF     rdcCs>d|jj|j|jjf}t|jjdkr0|d7}t|dS)NaColumn '%s.%s' is marked as a member of the primary key for table '%s', but has no Python-side or server-side default generator indicated, nor does it indicate 'autoincrement=True' or 'nullable=True', and no explicit value is passed. Primary key columns typically may not store NULL.ra0 Note that as of SQLAlchemy 1.1, 'autoincrement=True' must be indicated explicitly for composite (e.g. multicolumn) primary keys if AUTO_INCREMENT/SERIAL/IDENTITY behavior is expected for one of the columns in the primary key. CREATE TABLE statements are impacted by this change as well on most backends.)r&fullnamerNlenrur warn)rmsgrrrr|s r|)TFN)TN)TN)"__doc__r\r_rrrrrr symbolr rFrrTr%r2r3rtrvrwrxrir}rrZ ColumnElementrrr/r9r-rdr|rrrrsR      " &*1xI0L*. L *3