bgR]^UddlmZddlmZddlZddlmZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZer~ddlmZddlmZddlmZddlmZddlmZddl m!Z!ddl"m#Z#ddl"m$Z$ddl"m%Z%dd l&m'Z'dd!l&m(Z(dd"l&m)Z)dd#l&m*Z*dd$l&m+Z+dd%l&m,Z,dd&l-m.Z.dd'l/m0Z0dd(lm1Z1dd)l2m3Z3dd*l4m5Z5dd+l4m6Z6Gd,d-e7Z8iZ9d.e:d/<ed0gd1Z;Gd2d3e84Zr=r/r/3s(      r>r/zDict[str, Type[DefaultImpl]]r:Params)token0tokensargskwargsceZdZUdZdZdZdZddhfZded<d Z d ed <d Z d ed<ddZ e ddZ dd"Zdd%Zdd*Zedd+Zd,d ejfdd5Z ddd7Z dddMZ dddQZ dddRZddTZddVZ dddZZdd[Zdd\Zdd_Zdd`Z ddaZ!ddcZ"dddZ# dddjZ$ddmZ%ddpZ&ddsZ'ddvZ(dwZ)dd~Z*dZ+ dddZ,ddZ-ddZ.dZ/ddZ0ddZ1ddZ2ddZ3dZ4ddZ5dZ6d,S) DefaultImplaProvide the entrypoint for major migration operations, including database-specific behavioral variances. While individual SQL/DDL constructs already provide for database-specific implementations, variances here allow for entirely different sequences of operations to take place for a particular migration, such as SQL Server's special 'IDENTITY INSERT' step for bulk inserts. defaultF;NUMERICDECIMALzTuple[Set[str], ...] type_synonymsrBz Sequence[str]type_arg_extract)on_nullzTuple[str, ...]identity_attrs_ignoredialectr connectionOptional[Connection]as_sqlbooltransactional_ddlOptional[bool] output_bufferOptional[TextIO] context_optsr5returnNonec||_||_||_|dd|_||_i|_||_|||_|jr|jstj ddSdS)N literal_bindsFz3Can't use literal_binds setting without as_sql mode) rRrSrUgetr_rYmemor[rWr CommandError)selfrRrSrUrWrYr[s r=r9zDefaultImpl.__init__\s $ )--ouEE* (  (%6D "   ; 'I    r>Type[DefaultImpl]c&t|jSN)r:name)r;rRs r=get_by_dialectzDefaultImpl.get_by_dialectvsgl##r>rr1c|jJ|j|dz|jdS)Nz )rYwriteflush)rcrs r= static_outputzDefaultImpl.static_outputzsG!---   ///   """""r>batch_opr-cdS)zReturn True if the given :class:`.BatchOperationsImpl` would need the table to be recreated and copied in order to proceed. Normally, only returns True on SQLite when operations other than add_column are present. FrB)rcrms r=requires_recreate_in_batchz&DefaultImpl.requires_recreate_in_batchs ur> batch_implr,tabler&cdS)zperform any operations needed on a table before a new one is created to replace it in batch mode. the PG dialect uses this to drop constraints on the table before the new one uses those same names. NrB)rcrprqs r=prep_table_for_batchz DefaultImpl.prep_table_for_batchr>c|jSrf)rSrcs r=bindzDefaultImpl.binds r>N constructUnion[ClauseElement, str]execution_optionsOptional[dict[str, Any]] multiparamsSequence[dict]paramsOptional[CursorResult]cTt|trt|}|jr|s|rt d|jr-t|t jstddi}ni}|j dd|j i|}| t| dd |jzdS|j}|J|r |jdi|}|rt|t"sJ||fz }|||S) Nz+Execution arguments not allowed with as_sqlr_T)compile_kwargsrR z rB) isinstancer1rrU Exceptionr_r DDLElementdictcompilerRrlreplacestripcommand_terminatorrSrztupleexecute)rcrxrzr|r~ compile_kwcompiledconns r=_execzDefaultImpl._execs i % % (YI ;  Of O MNNN! *6,++ "/41HIII  (y( (2H   H %%dF3399;;)*   4?D###  C-t-BB0ABB )!+u55555y( <<; r>sqlc2|||dSrf)r)rcrrzs r=rzDefaultImpl.executes 3)*****r> table_name column_namenullableserver_default%Union[_ServerDefault, Literal[False]]rg Optional[str]type_Optional[TypeEngine]r autoincrementcomment$Optional[Union[str, Literal[False]]]existing_comment existing_typeexisting_server_defaultOptional[_ServerDefault]existing_nullableexisting_autoincrementkwrc ||tjdd|/|tj||||| | | | |dur{i}t j|| r tj}n3t j|| rtj }||d<n tj }|||||f|| | | | d||/|tj ||||| | | | | dur/|tj ||| || | | | |0|tj ||||| | | dSdS)NzBautoincrement and existing_autoincrement only make sense for MySQL) stacklevel)rrrrrFimpl)rrrr)rwarnrrColumnNullabler_server_default_is_computedComputedColumnDefault_server_default_is_identityIdentityColumnDefault ColumnDefault ColumnType ColumnComment ColumnName)rcrrrrrgrrrrrrrrrrcls_s r= alter_columnzDefaultImpl.alter_columns5$  $(>(J I,       JJ#!"/,C&7%5        & &B6 7 *18 7 *1!6 ) JJ" ""/,C&7%5          JJ!"/,C&7%5       %   JJ"!"/,C&7%5         JJ!"/,C&7       r>column Column[Any]!Optional[Union[str, quoted_name]]cZ|tj|||dSNr)rr AddColumn)rcrrrs r= add_columnzDefaultImpl.add_column<s- 4>*fVDDDEEEEEr>c Z|tj|||dSr)rr DropColumn)rcrrrrs r= drop_columnzDefaultImpl.drop_columnDs- 4?:vfEEEFFFFFr>constc|j||r)|tj|dSdSrf) _create_rulerr AddConstraintrcrs r=add_constraintzDefaultImpl.add_constraintMsI   %););D)A)A % JJv+E22 3 3 3 3 3 & %r>r#cT|tj|dSrf)rrDropConstraintrs r=drop_constraintzDefaultImpl.drop_constraintQs% 6(//00000r>old_table_namenew_table_nameUnion[str, quoted_name]cZ|tj|||dSr)rr RenameTable)rcrrrs r= rename_tablezDefaultImpl.rename_tableTs9  ^^F K K K     r>c|j||jd||t j||j||jd||jD])}|t j|*|j j o |j j }|j }|r|r| ||jD]"}|j }|r|r||#dSNF) checkfirst _ddl_runner)dispatch before_createrSrr CreateTable after_createindexes CreateIndexrRsupports_commentsinline_commentsrcreate_table_commentcolumnscreate_column_comment)rcrqindex with_commentrrs r= create_tablezDefaultImpl.create_table^s6 $$ 4?u$ %    6%e,,--- ## 4?u$ $   ] 2 2E JJv)%00 1 1 1 1 L * O4<3O/O -  -| -  % %e , , ,m 3 3FnG 3< 3**6222 3 3r>c|j||jd||t j||j||jd|dSr)r before_droprSrr DropTable after_droprcrqs r= drop_tablezDefaultImpl.drop_tableus "" 4?u$ #    6#E**+++ !! 4?u$ "     r>rr%cT|tj|dSrf)rrrrcrs r= create_indexzDefaultImpl.create_index~s% 6%e,,-----r>cT|tj|dSrf)rrSetTableCommentrs r=rz DefaultImpl.create_table_comments% 6)%0011111r>cT|tj|dSrf)rrDropTableCommentrs r=drop_table_commentzDefaultImpl.drop_table_comments% 6*51122222r>ColumnElement[Any]cT|tj|dSrf)rrSetColumnComment)rcrs r=rz!DefaultImpl.create_column_comments% 6*62233333r>cT|tj|dSrf)rr DropIndexrs r= drop_indexzDefaultImpl.drop_indexs% 6#E**+++++r>TUnion[TableClause, Table]rows List[dict] multiinsertc 4t|tstd|r*t|dtstd|jrW|D]R}|t jjdifd| DSdS|rd|r+|t j|dS|D]6}|t jjdi|5dSdS)Nz List expectedrzList of dictionaries expectedc i|]I\}}|t|tjs'tj||j|jn|JS))r)rr_literal_bindparamcr8).0kvrqs r= z+DefaultImpl.bulk_insert..sx   !%1$. !;#A$$ #{= !1EGAJO     "#   r>)r|rB) rlist TypeErrorrrUrr_insert_inlinevaluesitems)rcrqrrrows ` r= bulk_insertzDefaultImpl.bulk_inserts $%% =O,, ,  =*T!Wd33 =;<< < ;    r"rCcj|jj|j}t jd|}g}d}|D]/}t jd|r|}||0t|d|ddgi}|rt jd|D]y}d|vrG| d\} } | |j | <M|j | z|S)Nz[\w\-_]+|\(.+?\)z^\(.*\)$rrz[^(),]+=)rR type_compilerprocessr8lowerrefindallmatchappendrCsplitrrGrF) rcr definitionrE term_tokens paren_termtokenr~termkeyvals r=_tokenize_column_typez!DefaultImpl._tokenize_column_types*\/77 DDJJLL /<<   * *Ex U++ *" ""5)))) A ABBR@@  5 9j99 5 5$;;#zz#HC14FM#))++..K&&tzz||4444 r>inspector_paramsmetadata_paramscX|j|jkrdSd|jD}d|jg|jz}d|jg|jz}|D]=}||h|s!|j|jh|rdS>dS)NTc&g|]}d|DS)c6h|]}|SrB)r )rts r= z=DefaultImpl._column_types_match...s ...1QWWYY...r>rB)rbatchs r= z3DefaultImpl._column_types_match..s'OOO5.....OOOr> F)rDrNjoinrEissubset)rcrrsynonymsinspector_all_termsmetadata_all_termsr s r=_column_types_matchzDefaultImpl._column_types_matchs  "o&< < <4OODinspected_params meta_paramsctt|jt|jkr|j|jkrdSt|jt|jkr|j|jkrdSd|j}d|j}|jD]_}t j||}t j||}|r1|r/|d|dkrdS`dS)aWe want to compare column parameters. However, we only want to compare parameters that are set. If they both have `collation`, we want to make sure they are the same. However, if only one specifies it, dont flag it for being less specific Fr"rT) lenrErFr#r rOr searchgroup)rcr)r*inspmetaregmimms r=_column_args_matchzDefaultImpl._column_args_matchs'  " # #s+;+B'C'C C C"&6&===5   ! !S)9)>%?%? ? ? $4$9995xx(/006688xx *++1133(  C3%%B3%%B b RXXa[[BHHQKK77uutr>inspector_columnmetadata_columnc||}||}|||sdS|||sdSdS)zReturns True if there ARE differences between the types of the two columns. Takes impl.type_synonyms into account between retrospected and metadata types TF)rr(r4)rcr5r6rrs r= compare_typezDefaultImpl.compare_typesm 556FGG44_EE''(8/JJ 4&&'7II 4ur>c||kSrfrB)rcr5r6rendered_metadata_defaultrendered_inspector_defaults r=compare_server_defaultz"DefaultImpl.compare_server_default s*-FFFr> conn_uniquesSet[UniqueConstraint] conn_indexes Set[Index]metadata_unique_constraintsmetadata_indexescdSrfrB)rcr=r?rArBs r=correct_for_autogen_constraintsz+DefaultImpl.correct_for_autogen_constraints)s  r>cb|jj|jurt|d||d<dSdS)Nexpr)r8_type_affinityr)rcexistingexisting_transfernew_types r=cast_for_batch_migratez"DefaultImpl.cast_for_batch_migrate2sC = 'x/F F F(,!&)8)) f % % % G Fr>rFris_server_defaultc Rddddi}t|jdd|ji|S)zRender a SQL expression that is typically a server default, index expression, etc. .. versionadded:: 1.0.11 rTF)r_ include_tablerRrB)r1rrR)rcrFrLrrs r=render_ddl_sql_exprzDefaultImpl.render_ddl_sql_expr8sT uMM  DL    (2     r> inspectorrrc|jSrf)autogen_column_reflect)rcrPs r=_compat_autogen_column_reflectz*DefaultImpl._compat_autogen_column_reflectKs **r>conn_fksSet[ForeignKeyConstraint] metadata_fkscdSrfrB)rcrTrVs r=correct_for_autogen_foreignkeysz+DefaultImpl.correct_for_autogen_foreignkeysNs r>cdS)zA hook that is attached to the 'column_reflect' event for when a Table is reflected from the database during the autogenerate process. Dialects can elect to modify the information gathered here. NrB)rcrPrq column_infos r=rRz"DefaultImpl.autogen_column_reflectUrtr>cdS)zA hook called when :meth:`.EnvironmentContext.run_migrations` is called. Implementations can set up per-migration-run state here. NrBrvs r=start_migrationszDefaultImpl.start_migrations^rtr>c@|d|jzdS)zEmit the string ``BEGIN``, or the backend-specific equivalent, on the current connection context. This is used in offline mode and typically via :meth:`.EnvironmentContext.begin_transaction`. BEGINNrlrrvs r= emit_beginzDefaultImpl.emit_beginfs& 7T%<<=====r>c@|d|jzdS)zEmit the string ``COMMIT``, or the backend-specific equivalent, on the current connection context. This is used in offline mode and typically via :meth:`.EnvironmentContext.begin_transaction`. COMMITNr_rvs r= emit_commitzDefaultImpl.emit_commitps& 8d&==>>>>>r>type_objr)autogen_contextr+Union[str, Literal[False]]cdS)NFrB)rcrdres r= render_typezDefaultImpl.render_typezs ur>cttj||tj\}}t |dd}t |dd}t |t |kr|d||j||t |pt |t |kfS)Nalways) _compare_identity_optionsr_identity_attrsIdentitygetattrrVadddifference_updaterQ)rcmetadata_identityinspector_identitydiffignored meta_alwaysinspector_alwayss r=_compare_identity_defaultz%DefaultImpl._compare_identity_defaults2  '    " "   g/4@@ "#5xFF   %5 6 6 6 6 HHX    t9:::   JJ M$011T:L5M5MM   r>Tuple[Any, ...]c>td|jDS)Nc3$K|] }|jV dSrfrg)rcols r= z/DefaultImpl.create_index_sig..s$77#SX777777r>)rrrs r=create_index_sigzDefaultImpl.create_index_sigs!77777777r>c d|D}t|D]i}|j|vr tj|}|rGt jd|jd|jdtjd||jdS)Nci|] }|j| SrBr{)rrs r=rz8DefaultImpl._skip_functional_indexes..s@@@a@@@r>z@autogenerate skipping metadata-specified expression-based index z ; dialect z under SQLAlchemy z6 can't reflect these indexes so they can't be compared) rrgris_expression_indexrrr7sqlalchemy_versiondiscard)rcrBr?conn_indexes_by_nameidxiexs r=_skip_functional_indexesz$DefaultImpl._skip_functional_indexess@@<@@@()) . .Cx///1#66C . FxFF-1-=FF#."@FFF!((--- . .r>)rRrrSrTrUrVrWrXrYrZr[r5r\r])rRrr\rd)rr1r\r])rmr-r\rV)rpr,rqr&r\r])r\rT) rxryrzr{r|r}r~r5r\rrf)rryrzr{r\r]) NFNNNNFNNNNN) rr1rr1rrXrrrgrrrrrrrXrrrrrrrrrrXrrXrrr\r])rr1rrrrr\r])rr1rrrrr\r])rrr\r])rr#r\r])rr1rrrrr\r])rqr&r\r])rr%r\r])rrr\r])T)rqrrrrrVr\r])rr"r\rC)rrCrrCr\rV)r)rCr*rCr\rV)r5rr6r"r\rV) r=r>r?r@rAr>rBr@r\r])F)rFrrLrVrrr\r1)rPrr\r)rTrUrVrUr\r])r\r])rdr)rer+r\rf)rr%r\rx)7r?r@rA__doc__r7rWrrN__annotations__rOrQr9 classmethodrhrlrorspropertyrwr immutabledictrrrrrrrrrrrrrrrrrr(r4r8r<rDrKrOrSrXrRr\r`rcrhrwr~rrBr>r=rIrIEs)  K,5y+A*CMCCCC&(((((-999994$$$[$####         X 7;&(!3!3!5!5 (((((Z7;+++++$(@E"&* $(,8=*..2<@,015nnnnnh59 FFFFF!% GGGGG4444111159      3333.    ....222233334444,,,,! $$$$$L$$$$L,B GGG    >C     &++++           >>>>????    :8888.....r>rI) metaclassc t}t}|D]l}t||d}t||d}t||d} | |kr1||kr||W||m||fSrf)setrnro) attributes metadata_io inspector_io default_iors ignored_attrattr meta_value default_value conn_values r=rkrks 55D55L[$55  D$77 \466  # #]**  &&&&  r>)> __future__r collectionsrr typingrrrrr r r r r rr sqlalchemyrrrrrrrrsqlalchemy.enginerrsqlalchemy.engine.cursorrsqlalchemy.engine.reflectionrsqlalchemy.sql.elementsrr r!sqlalchemy.sql.schemar"r#r$r%r&r'sqlalchemy.sql.selectabler(sqlalchemy.sql.type_apir)r*autogenerate.apir+operations.batchr,r-r8r/r:rrCrIrkrBr>r=rs"""""""""""""  7,,,,,,))))))555555666666555555555555333333,,,,,,000000::::::++++++++++++666666555555222222$$$$$$111111111111666666     t   (*)))) HDDD E Ej .j .j .j .j .Hj .j .j .j .Zr>