|L itddlmZddlZddlZddlmZddlmZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddl!m"Z"ddl#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/m0Z0dd'l/m1Z1d(d)l2m3Z3d(d*l4m5Z5d(d+l6m7Z7d(d,l6m8Z8d(d-l9m:Z:d(d.l9m;Z;d(d/l3mZ>e rldd1lm?Z?dd2lm@Z@dd3lmAZAdd4lBmCZCdd5lDmEZEdd6lFmGZGdd7lHmIZIdd8lHmJZJdd9lmKZKdd:lmLZLdd;lmMZMddlQmRZRdd?l%mSZSd(d@lTmUZUd(dAlVmWZWd(dBlXmYZYeje[Z\GdCdDe1Z]GdEdFe(Z^e>e.dG dVdHZ_e>e^dG dWdIZ`e>e)dG dXdJZae>e-dG dYdKZbe;jdLe:jdLdMe7jjdNGdOdPe7jZfe5jjef dZdQZie5jje d[dRZkd\dSZl d]dTZm d^dUZny)_) annotationsN)Any)cast)Dict)List)Optional)Sequence)Tuple) TYPE_CHECKING)Union)Column)Float)Identity)literal_column)Numeric)select)text)types)BIGINT)ExcludeConstraint)INTEGER) CreateIndex) ColumnClause) TextClause)FunctionElement)NULLTYPE) alter_column) alter_table) AlterColumn) ColumnComment)format_column_name)format_table_name) format_type)IdentityColumnDefault) RenameTable)ComparisonResult) DefaultImpl)util)render)ops) schemaobj)BatchOperations) Operations) sqla_compat)compiles)Literal)Index)UniqueConstraint)ARRAY) PGDDLCompiler)HSTORE)JSON)JSONB) ClauseElement) ColumnElement) quoted_name)MetaData)Table) TypeEngine)_ServerDefault)AutogenContext)_f_name)MigrationContextc LeZdZdZdZej ddhfzZddZdZdZ dd ddddddddd d fd Z d Z d Z e jde jde jde jde jdfZd!dZ d"dZ d#dZ d$dZ d%dZd&dZ d' d(fd Z d)dZ d*dZ d+dZ d,dZ d-dZxZS).PostgresqlImpl postgresqlTFLOATzDOUBLE PRECISIONc  |jjddxsd}|D]N}||jjvs|jj t |t jP|jt|fi|y)Npostgresql_include) kwargsgettablec append_columnr sqltypesNullType_execr)selfindexkwrIcols \/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/alembic/ddl/postgresql.py create_indexzPostgresqlImpl.create_indexYsz#\\--.BDIOR% C%++--' ))3 1 12  ;u++,c|jD]9}|j|j|jvs)|j|;yN) constraintsnamenamed_constraintsdrop_constraint)rS batch_implrM constraints rWprep_table_for_batchz#PostgresqlImpl.prep_table_for_batchesA++ 1J+OOz'C'CC$$Z0  1rYc|jr||jjury|}||k(}|ryd|||jfvr| S|jj}t |t rHt |jttfstjdd|}d|d}t|}|j}|J|jtt||k( S)NFz^'|'$') primary_keyrM_autoincrement_columnserver_defaultarg isinstancestrtyperrresubr connectionscalarr) rSinspector_columnmetadata_columnrendered_metadata_defaultrendered_inspector_defaultconn_col_defaultdefaults_equalmetadata_defaultconns rWcompare_server_defaultz%PostgresqlImpl.compare_server_defaultms  ' '?#8#8#N#NN5)-FF    %  * *  &% %*99== & ,.33gu5EF#%66(B8H#I %&'7&8#: -.>? ;; >"237GG H   rYNF) nullablerhr]type_schema autoincrement existing_typeexisting_server_defaultexisting_nullableexisting_autoincrementc | jdd}||tjd|"|jt |||||| | | t |||f|||||| | | | d | y)Npostgresql_usingz6postgresql_using must be used with the type_ parameter)r|usingr~rr) rzrhr]r|r}r~rrr)popr* CommandErrorrRPostgresqlColumnTypesuperr)rS table_name column_namerzrhr]r{r|r}r~rrrrUr __class__s rWrzPostgresqlImpl.alter_columns&)40  ##H    JJ$!"/,C&7      )''$;/#9  rYc||jdrt|dttfrt j d|d}|rut j|td|jdj}|r4|\}}||dk(r&tjd||j||d=yyyyyy) Ndefaultrlznextval\('(.+?)'::regclass\)a9select c.relname, a.attname from pg_class as c join pg_depend d on d.objid=c.oid and d.classid='pg_class'::regclass and d.refclassid='pg_class'::regclass join pg_class t on t.oid=d.refobjid join pg_attribute a on a.attrelid=t.oid and a.attnum=d.refobjsubid where c.relkind='S' and c.oid=cast(:seqname as regclass)r)seqnamer]z^Detected sequence named '%s' as owned by integer column '%s(%s)', assuming SERIAL and omitting)rLrjrrrmmatchr0_exec_on_inspectorrgroupfirstloginfor])rS inspectorrM column_info seq_matchrrcolnames rWautogen_column_reflectz%PostgresqlImpl.autogen_column_reflects ??9 %*  '6!2+ /Y1GI"55 ; &OOA.%' '+$GW+f"55;$!JJ# ( 26# + %rYc|Dchc]}|jjdr|!}}|D]}|j|tjs|j ||yycc}w)Nduplicates_constraint)rrLremover0sqla_2_skip_functional_indexes)rSconn_unique_constraints conn_indexesmetadata_unique_constraintsmetadata_indexesrTdoubled_constraintsixs rWcorrect_for_autogen_constraintsz.PostgresqlImpl.correct_for_autogen_constraintssx& zz~~56   & $B    # $!!  ) )*:L I" s$A'z( asc nulls last)$z(?CD 4<66/2t4DtAw#~$r(c/":DtAw#~$r(c/ ,, B $'u'"ZZ] sFU|d34j0   tAw#~$r(c/":DtAw#~$r(c/**\* == ;;r4(D66/2t4D||C$ rYc<|jjdryy)Npostgresql_nulls_not_distinct)nulls_not_distinctrJ)dialect_kwargsrL)rSitems rW_dialect_optionszPostgresqlImpl._dialect_options>s    " "#B C*rYc g}|j||}|r|j||j}|j}t|t|k7r)|jdt|dt||rt j |Sg}t t||dD]\}\} } |j| } |j|| } |j| } |j|| }| |k(rU| jjdrJd| vsd| vrB|jd|d| dtjd |d| d |jd |jd|d| d| |j|}|j|}||k7r|j!d |d||rt j |S|rt j"|St j$S) Nzexpression number  to r_opsrrz expression #z' detected as including operator clause.z Expression #z in index a  detected to include an operator clause. Expression compare cannot proceed. Please move the operator clause to the ``postgresql_ops`` dict to enable proper compare of the index expressions: https://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#operator-classeszoptions )_compare_index_uniqueappend expressionslenr' Different enumeratezip_compile_elementrstripendswithr*warnr]rextendSkipEqual)rSmetadata_indexreflected_indexmsg unique_msgm_exprsr_exprsskipposm_er_e m_compilem_text r_compiler_text m_options r_optionss rWcompare_indexeszPostgresqlImpl.compare_indexesGs // O   JJz " ,,!-- w<3w< ' JJ+CL>c'l^L M #--c2 2(Wg)>B POC#s--c2I--niHF--c2I--niHF"++F3y C9$4 "3%q 644 "3%q Z&++./ff \#a }D NO5 P8)).9 ))/:  ! JJ)D < = #--c2 2 #((. .#))+ +rYc|j|}|j|}|j}|j}||k7rtjd|d|S|j |j }|j |j }||k7rtjd|d|StjS)Nz expression r)_create_metadata_constraint_sig _create_reflected_constraint_sigunnamedr'rrconstr) rSmetadata_constraintreflected_constraint metadata_tup reflected_tupmeta_sigconn_sig metadata_doconn_dos rWcompare_unique_constraintz(PostgresqlImpl.compare_unique_constraints ;;  ==   '' (( x #--hZtH:6 ++L,>,>? '' (;(;< ' !#--gYd;-8  %%''rYc|jdij}|jds|jdd|S)Ndialect_optionsrI)rLcopyr)rSreflected_optionskindoptionss rW adjust_reflected_dialect_optionsz/PostgresqlImpl.adjust_reflected_dialect_optionssA$''(92>CCE{{/0 KK,d 3rYczt|tr|S|j|jdddjS)NTF) literal_binds include_table)dialectcompile_kwargs)rjrkrrstring)rSelements rWrzPostgresqlImpl._compile_elements= gs #NLL-1EJ  & rYc n|r t|ts|j}t||f||d|S)zdRender a SQL expression that is typically a server default, index expression, etc. )is_server_defaultis_index)rjr self_grouprrender_ddl_sql_expr)rSrrrrUrs rWrz"PostgresqlImpl.render_ddl_sql_exprsD Jt\:??$Dw*  $5 LN  rYct|j}|jdsyt|d|jzr"t |d|jz}|||Sy)Nzsqlalchemy.dialects.postgresqlFz_render_%s_type)rl __module__ startswithhasattr__visit_name__getattr)rSr{autogen_contextmodmeths rW render_typezPostgresqlImpl.render_typesa5k$$~~>? 4*U-A-AA B4!2U5I5I!IJD/ /rYc Ntttj||ddS)N text_typez(.+?\(.*text_type=)rrkr+_render_type_w_subtyperSr{rs rW_render_HSTORE_typez"PostgresqlImpl._render_HSTORE_types,   ) ) 5K   rYc Ntttj||ddS)N item_typez(.+?\()rrs rW_render_ARRAY_typez!PostgresqlImpl._render_ARRAY_types+   ) ) Z   rYc Ntttj||ddSN astext_typez(.+?\(.*astext_type=)rrs rW_render_JSON_typez PostgresqlImpl._render_JSON_type,   ) ) 7O   rYc Ntttj||ddSrrrs rW_render_JSONB_typez!PostgresqlImpl._render_JSONB_typerrY)rTr3rUrreturnNone)rrkrrkrzOptional[bool]rhz/Optional[Union[_ServerDefault, Literal[False]]]r] Optional[str]r{Optional[TypeEngine]r|rr}rr~r rzOptional[_ServerDefault]rrrrrUrrr)rTr3rrkrrk)rzUnion[Index, UniqueConstraint]rzTuple[Any, ...])rr3rr3rr')rr4rr4rr')rDict[str, Any]rrkrr!)rzUnion[ClauseElement, str]rrk)FF) rr:rboolrr"rUrrrk)r{r?rrArzUnion[str, Literal[False]])r{r7rrArrk)r{r5rrArrk)r{r8rrArrk)r{r9rrArrk)__name__r __qualname__ __dialect__transactional_ddlr( type_synonymsrXrbryrrrrmrrrrrrrrrr rrrr __classcell__rs@rWrErERsK-- $%1M -1) `$( "&* $(,.2<@,015!5 5 5 ! 5  5 5 $5 5 &5 ,5 ":5 *5 !/!5 "#5 $ %5 n%3NJ>  '( -. 9 () )*  D2 :,:,:,  :,x(-(/(  (8!/7: #(          .  2@  #   .<    -;    ,:    -;  rYrEc0eZdZ dfd ZxZS)rc |jdd}t|||fi|tj||_||_y)Nr)rr__init__rP to_instancer{r)rSr]rr{rUrrs rWr,zPostgresqlColumnType.__init__sBw% {1b1))%0  rY)r]rkrrkr{r?rr)r#rr$r,r(r)s@rWrrs-&)2< rYrrFc xt||j|jdt||jdS)Nz RENAME TO )rrr|r#new_table_namercompilerrUs rWvisit_rename_tabler2s6 Hg00'..A(G$:$:DA rYc t||j|jdt||jddt ||j zd|jrd|jzSdS)NrzTYPE %szUSING %srd)rrr|rrr$r{rr0s rWvisit_column_typer4sn Hg00'..AXw223K'--88&-mm W]]";  :<;  rYc  d}|j8|jj|jtjnd}|j t ||j|jt||j|S)Nz9COMMENT ON COLUMN {table_name}.{column_name} IS {comment}NULL)rrcomment) r7 sql_compilerrender_literal_valuerPStringformatr#rr|r"r)rr1rUddlr7s rWvisit_column_commentr=s FC ?? & 22 OOX__.    ::$ g(('.. 'x1D1DE  rYc 4t||j|jdt||jd}|j |dz }|S|j %|dz }||j|j z }|S|jj|j |j \}}}|j }t|D]J}|dk(r|d|jrdndzz }|d|jtd i|t||izz }L|S) Nrz DROP IDENTITYzADD alwayszSET GENERATED %s ALWAYSz BY DEFAULTzSET %s rJ)rrr|rrrrvisit_identity_columnimpl_compare_identity_defaultsortedr?get_identity_optionsrr)rr1rUrdiff_identityattrs rWrArA3s+ Hg00'..AXw223 D   ( ( 0  ..w?? \\;; OOW<< a??4L Dx+ (H\ H$A$A?gh&=>?%   rYcreate_exclude_constraintbatch_create_exclude_constraintexclude_constraintceZdZdZdZ d d dZe d dZ d d dZe ddZ e ddZ y)CreateExcludeConstraintOpz0Represent a create exclude constraint operation.excludeNc f||_||_||_||_||_||_||_yr[)constraint_namerelementswherer|_orig_constraintrU)rSrQrrRrSr|rTrUs rWr,z"CreateExcludeConstraintOp.__init__`s7 /$    0rYc @tj|}||j|j|jDcgc] \}}}||f c}}}t d|j |j ||j|j|j Scc}}}w)NzColumnElement[bool] | None)rSr|rT deferrable initiallyr) r0_table_for_constraintr] _render_exprsrrSr|rVrWr)clsraconstraint_tablerr]ops rWfrom_constraintz)CreateExcludeConstraintOp.from_constraintus'<?   T__T[[  A ]]%%** gg      4    OOF42 3  4 D! rYc:||||fi|}|j|S)aIssue an alter to create an EXCLUDE constraint using the current migration context. .. note:: This method is Postgresql specific, and additionally requires at least SQLAlchemy 1.0. e.g.:: from alembic import op op.create_exclude_constraint( "user_excl", "user", ("period", "&&"), ("group", "="), where=("group != 'some group'"), ) Note that the expressions work the same way as that of the ``ExcludeConstraint`` object itself; if plain strings are passed, quoting rules must be applied manually. :param name: Name of the constraint. :param table_name: String name of the source table. :param elements: exclude conditions. :param where: SQL expression or SQL string with optional WHERE clause. :param deferrable: optional bool. If set, emit DEFERRABLE or NOT DEFERRABLE when issuing DDL for this constraint. :param initially: optional string. If set, emit INITIALLY when issuing DDL for this constraint. :param schema: Optional schema name to operate within. )invoke)rZ operationsrQrrRrUr\s rWrJz3CreateExcludeConstraintOp.create_exclude_constraints)V*h =" =  $$rYc|jj|d<|||jj|fi|}|j|S)a3Issue a "create exclude constraint" instruction using the current batch migration context. .. note:: This method is Postgresql specific, and additionally requires at least SQLAlchemy 1.0. .. seealso:: :meth:`.Operations.create_exclude_constraint` r|)rBr|rrh)rZrirQrRrUr\s rWrKz9CreateExcludeConstraintOp.batch_create_exclude_constraintsE&"--8 *//"<".do_expr_where_optss,6+C+C   (x )#          ' KK//$$o  $7$!Q1%78 '  $8s BB$ z-%(prefix)screate_exclude_constraint(%(args)s)r~)prefixrz%%(prefix)sExcludeConstraint(%(args)s)) _has_batchrVrrkrWrrMr|r+_identr]_render_gen_namereprr_alembic_autogenerate_prefixjoinr{)rarrp has_batchrrrs`` @rWrqrqs FHD**I \3z'<'<#=>? [#j&:&:";<= Wc*"2"2345 :#3#3#:#: Xv}}Z-=-=-D-DEFG Z__ V,,_jooN O , ((*//J K  T&-- (8(8(=(=>?@ @D &()>99/JIIdOB   "#65oFIIdO:   rYc t|tr6|jrd}nd}|tj||j dzStj ||t|ttfS)Nz"%(prefix)sliteral_column(%(name)r)z%(prefix)scolumn(%(name)r))rr])wrap_in_element) rjr is_literalr+_sqlalchemy_autogenerate_prefixr]rrr)valuertemplates rWrr@sr %&   ;H3H<<_MJJ   ,,  &uz?.KL  rY)rr&r1r6rrk)rrr1r6rrk)rr!r1r6rrk)rr%r1r6)rrAr\rNrrk)rarrrArur=rrk)rrArrk)rarrrArpr"rrk)rzGUnion[ColumnClause[Any], Column[Any], TextClause, FunctionElement[Any]]rrArrk)o __future__rloggingrmtypingrrrrrr r r r sqlalchemyr rrrrrrrrPsqlalchemy.dialects.postgresqlrrrsqlalchemy.schemarsqlalchemy.sql.elementsrrsqlalchemy.sql.functionsrsqlalchemy.typesrbaserrr r!r"r#r$r%r&rBr'r(rdr* autogenerater+rir,r-operations.baser.r/r0util.sqla_compatr1r2r3r4$sqlalchemy.dialects.postgresql.arrayr5#sqlalchemy.dialects.postgresql.baser6%sqlalchemy.dialects.postgresql.hstorer7#sqlalchemy.dialects.postgresql.jsonr8r9r:r;r<sqlalchemy.sql.schemar=r>sqlalchemy.sql.type_apir?r@autogenerate.apirAautogenerate.renderrBruntime.migrationrC getLoggerr#rrErr2r4r=rAregister_operationAddConstraintOpregister_add_constraintrN renderers dispatch_forrr_constraint_renderersrwr{rqrrJrYrWrs#  %(1<2)0.4%$#'"!"-(' +:A<89553.+2$1-4g!h [h V ; +|$ $1%  - !-:. -& &3'* . ".;/D:;###!B,,-ABF% 3 3F%C< F%R89P#P)BPP:P **+<= C! C# C! C C> C< !< #<  <  < ~   $    rY