U oft@s*ddlmZddlZddlZddlmZddlmZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddl m!Z!ddl"m#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.d%d&l/m0Z0d%d'l1m2Z2d%d(l3m4Z4d%d)l3m5Z5d%d*l6m7Z7d%d+l6m8Z8d%d,l0m9Z9d%d-l:m;Z;e rdd.lmZ>dd1l?m@Z@dd2lAmBZBdd3lCmDZDdd4lEmFZFdd5lEmGZGdd6lmHZHdd7lmIZIdd8lmJZJdd9lKmLZLdd:lKmMZMdd;lNmOZOddlSmTZTd%d?lUmVZVeWeXZYGd@dAdAe.ZZGdBdCdCe%Z[e;e+dDdEdFdGdHdIdJZ\e;e[dDdCdFdGdHdKdLZ]e;e&dDdMdFdGdHdNdOZ^e;e*dDdPdFdQdRdSZ_e8`dTe7`dTdUe4jabdVGdWdXdXe4jaZce2jdeecdYdXdGdZd[d\Zfe2jgeed]dYd^dGd_d`daZhdYdGdbdcddZid]dYdedGdfdgdhZjdidYdGdjdkdlZkdS)m) annotationsN)Any)cast)Dict)List)Optional)Sequence)Tuple) TYPE_CHECKING)Union)Column)literal_column)Numeric)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)MigrationContextcseZdZdZdZejddhfZddddd d Zd d Zd dZ dRdddddddddddddddfdd Z ddZ ddZ e de de d e d!e d"fZdddd#d$d%Zd&d'd(d)d*Zddd+d,d-d.Zd/d/d+d0d1d2Zd3dd3d4d5d6Zd7dd8d9d:ZdSd;dd? Zd@dAdBdCdDdEZdFdAddCdGdHZdIdAddCdJdKZdLdAddCdMdNZdOdAddCdPdQZZS)TPostgresqlImpl postgresqlTFLOATzDOUBLE PRECISIONr/rNone)indexkwreturncKsR|jddpd}|D]$}||jjkr|jt|tjq|t |f|dS)Npostgresql_include) kwargsgettablec append_columnr sqltypesZNullType_execr)selfrDrErGcolrHrHD/opt/hc_python/lib/python3.8/site-packages/alembic/ddl/postgresql.py create_indexUs  zPostgresqlImpl.create_indexcCs0|jD]$}|jdk r|j|jkr||qdSN) constraintsnameZnamed_constraintsZdrop_constraint)rPZ batch_implrK constraintrHrHrRprep_table_for_batchas   z#PostgresqlImpl.prep_table_for_batchc Cs|jr||jjkrdS|}||k}|r*dSd|||jfkr@| S|jj}t|trt|jtsxt dd|}d|d}t |}|j }|dk st |tt ||k S)NFz^'|'$')Z primary_keyrKZ_autoincrement_columnserver_defaultarg isinstancestrtyperresubr connectionAssertionErrorZscalarr,_select) rPZinspector_columnZmetadata_columnZrendered_metadata_defaultZrendered_inspector_defaultZconn_col_defaultZdefaults_equalZmetadata_defaultconnrHrHrRcompare_server_defaultis8       z%PostgresqlImpl.compare_server_defaultNFr^zOptional[bool]z%Union[_ServerDefault, Literal[False]] Optional[str]zOptional[TypeEngine]zOptional[_ServerDefault]) table_name column_namenullabler[rVtype_schema autoincrement existing_typeexisting_server_defaultexisting_nullableexisting_autoincrementrErFc  sz| dd}|dk r&|dkr&td|dk rL|t|||||| | | dtj||f|||||| | | | d | dS)NZpostgresql_usingz6postgresql_using must be used with the type_ parameter)rlusingrnrorp) rjr[rVrlrmrnrorprq)popr& CommandErrorrOPostgresqlColumnTypesuperr)rPrhrirjr[rVrkrlrmrnrorprqrErr __class__rHrRrsD   zPostgresqlImpl.alter_columncCs|dr~t|dttfr~td|d}|r~tj|td| dd }|r~|\}}||dkr~t d||j ||d=dS) Ndefaultr_znextval\('(.+?)'::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)seqnamerVz^Detected sequence named '%s' as owned by integer column '%s(%s)', assuming SERIAL and omitting)rJr]rrr`matchr,Z_exec_on_inspectorrgroupfirstloginforV)rPZ inspectorrKZ column_infoZ seq_matchrrzZcolnamerHrHrRautogen_column_reflects4     z%PostgresqlImpl.autogen_column_reflectcCs8dd|D}|D]}||qtjs4|||dS)NcSsh|]}|jdr|qS)Zduplicates_constraint)rrJ).0rDrHrHrR s zAPostgresqlImpl.correct_for_autogen_constraints..)remover,Zsqla_2Z_skip_functional_indexes)rPZconn_unique_constraintsZ conn_indexesZmetadata_unique_constraintsZmetadata_indexesZdoubled_constraintsZixrHrHrRcorrect_for_autogen_constraintss z.PostgresqlImpl.correct_for_autogen_constraintsz( asc nulls last)$z(?td|d|S||j}||j}||krttd|d|StS)Nz expression r)Z_create_metadata_constraint_sigZ _create_reflected_constraint_sigunnamedr#rrconstr) rPrrZ metadata_tupZ reflected_tupZmeta_sigZconn_sigZ metadata_doZconn_dorHrHrRcompare_unique_constraint~s&  z(PostgresqlImpl.compare_unique_constraintzDict[str, Any])reflected_optionskindrFcCs*|di}|ds&|dd|S)NZdialect_optionsrG)rJcopyrs)rPrroptionsrHrHrR adjust_reflected_dialect_optionss  z/PostgresqlImpl.adjust_reflected_dialect_optionszUnion[ClauseElement, str])elementrFcCs&t|tr|S|j|jddddjS)NTF)Z literal_bindsZ include_table)dialectcompile_kwargs)r]r^rrstring)rPrrHrHrRrs  zPostgresqlImpl._compile_elementr6bool)ris_server_defaultis_indexrErFc s0|rt|ts|}tj|f||d|S)zdRender a SQL expression that is typically a server default, index expression, etc. )rr)r]rZ self_grouprvrender_ddl_sql_expr)rPrrrrErwrHrRrsz"PostgresqlImpl.render_ddl_sql_exprr;r=zUnion[str, Literal[False]])rkautogen_contextrFcCsFt|j}|dsdSt|d|jrBt|d|j}|||SdS)Nzsqlalchemy.dialects.postgresqlFz_render_%s_type)r_ __module__ startswithhasattrZ__visit_name__getattr)rPrkrmodmethrHrHrR render_types   zPostgresqlImpl.render_typer3cCsttt||ddS)N text_typez(.+?\(.*text_type=)rr^r'Z_render_type_w_subtyperPrkrrHrHrR_render_HSTORE_typesz"PostgresqlImpl._render_HSTORE_typer1cCsttt||ddS)NZ item_typez(.+?\()rrrHrHrR_render_ARRAY_typesz!PostgresqlImpl._render_ARRAY_typer4cCsttt||ddSNZ astext_typez(.+?\(.*astext_type=)rrrHrHrR_render_JSON_typesz PostgresqlImpl._render_JSON_typer5cCsttt||ddSrrrrHrHrR_render_JSONB_typesz!PostgresqlImpl._render_JSONB_type) NFNNNNNNNN)FF)__name__r __qualname__Z __dialect__Ztransactional_ddlr$Z type_synonymsrSrXrfrrrr`rrrrrrrrrrrrrr __classcell__rHrHrwrRr@NsR 1.4'" <      r@cs(eZdZdddddfdd ZZS)rur^r;rC)rVrirkrFc s4|dd}tj||f|t||_||_dS)Nrr)rsrv__init__rNZ to_instancerkrr)rPrVrirkrErrrwrHrRrs  zPostgresqlColumnType.__init__)rrrrrrHrHrwrRrusrurAr"r2r^)rcompilerrFcKs"dt||j|jt||jdfS)Nz%s RENAME TO %s)rrhrlrZnew_table_namerrrErHrHrRvisit_rename_tables rcKs@dt||j|jt||jdt||j|jr8d|jndfS)Nz %s %s %s %szTYPE %szUSING %srY)rrhrlrrir rkrrrrHrHrRvisit_column_type s  rrcKsJd}|jdk r"|j|jtnd}|jt||j|jt ||j |dS)Nz9COMMENT ON COLUMN {table_name}.{column_name} IS {comment}ZNULL)rhricomment) rZ sql_compilerZrender_literal_valuerNStringformatrrhrlrri)rrrEZddlrrHrHrRvisit_column_comments" rr!)rrc Ksdt||j|jt||jf}|jdkr6|d7}|S|jdkr\|d7}|||j7}|S|j |j|j\}}}|j}t |D]H}|dkr|d|j rdnd7}q|d| t jf|t||i7}q|SdS) Nz%s %s z DROP IDENTITYzADD alwayszSET GENERATED %s ZALWAYSz BY DEFAULTzSET %s )rrhrlrriryrovisit_identity_columnimplZ_compare_identity_defaultsortedrZget_identity_optionsr,ZIdentityr)rrrErdiff_identityattrrHrHrRr.s2       rcreate_exclude_constraintbatch_create_exclude_constraintZexclude_constraintc @seZdZdZdZd!dddddd d d d d ZedddddZd"dddddZedddddddddZ edddddddd Z dS)#CreateExcludeConstraintOpz0Represent a create exclude constraint operation.excludeNzsqla_compat._ConstraintNamezUnion[str, quoted_name]zIUnion[Sequence[Tuple[str, str]], Sequence[Tuple[ColumnClause[Any], str]]]z)Optional[Union[ColumnElement[bool], str]]rgzOptional[ExcludeConstraint]rC)constraint_namerhelementswhererl_orig_constraintrFcKs.||_||_||_||_||_||_||_dSrT)rrhrrrlrrE)rPrrhrrrlrrErHrHrRr[s z"CreateExcludeConstraintOp.__init__r)rWrFc CsDt|}||j|jdd|jDtd|j|j||j|j|j d S)NcSsg|]\}}}||fqSrHrH)rrrVoprHrHrR xsz=CreateExcludeConstraintOp.from_constraint..zColumnElement[bool] | None)rrlr deferrable initiallyrr) r,Z_table_for_constraintrV _render_exprsrrrlrrrr)clsrWZconstraint_tablerHrHrRfrom_constraintps  z)CreateExcludeConstraintOp.from_constraintzOptional[MigrationContext])migration_contextrFcCsx|jdk r|jSt|}|j|j|jd}t|j|j|j d|j }|j D]\}}}| t |tqN|||S)N)rl)rVr)rr)Z SchemaObjectsrKrhrlrrrrrErrMr rZappend_constraint)rPrZ schema_objtZexclrrVoperrHrHrR to_constraints&    z'CreateExcludeConstraintOp.to_constraintr+r^rzOptional[Table]) operationsrrhrrErFcOs||||f|}||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)rrrrhrrErrHrHrRrs+z3CreateExcludeConstraintOp.create_exclude_constraintr*)rrrrErFcOs*|jj|d<|||jj|f|}||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` rl)rrlrhr)rrrrrErrHrHrRrs z9CreateExcludeConstraintOp.batch_create_exclude_constraint)NNN)N) rrr__doc__Zconstraint_typer classmethodrrrrrHrHrHrRrQs -rr=)rrrFcCst||ddS)NT)alter)_exclude_constraintr)rrrHrHrR_add_exclude_constraintsrrr9)rWrnamespace_metadatarFcCs&td||}|dk r|St||dS)NrF)r'Z_user_defined_renderr)rWrrrenderedrHrHrR!_render_inline_exclude_constraintsr)rrFcCs|j}|dk r|ddS)Nz*from sqlalchemy.dialects import postgresqlz postgresql.)importsadd)rrrHrHrR_postgresql_autogenerate_prefixs rr)rWrrrFcs0gj}jr$dtjfjr>dtjfjrXdtjf|s|rjjrdt jjf|sj rdt j ffdd}|rt t j g}|s|t t jj g7}| |dtd |d S|}d td |d SdS) NrrrrrlrVcsNfddjD}jdk r6|dtj|ddD|S)Ncs$g|]\}}}dt||fqS)z(%s, %r))_render_potential_column)rZsqltextrVZopstring)rrHrRrs zC_exclude_constraint..do_expr_where_opts..zwhere=%scSsg|]\}}d||fqS)z%s=%rrH)rkvrHrHrRr%s)rrrr'_render_potential_exprr)argsrrWoptsrHrRdo_expr_where_optss  z/_exclude_constraint..do_expr_where_optsz-%(prefix)screate_exclude_constraint(%(args)s)z, )prefixrz%%(prefix)sExcludeConstraint(%(args)s))Z _has_batchrrr^rrrrKrlr'_identrVZ_render_gen_namereprrZ_alembic_autogenerate_prefixjoinr)rWrrZ has_batchrrrHrrRrs<  rzGUnion[ColumnClause[Any], Column[Any], TextClause, FunctionElement[Any]])valuerrFcCsNt|tr0|jrd}nd}|t||jdStj||t|ttfdSdS)Nz"%(prefix)sliteral_column(%(name)r)z%(prefix)scolumn(%(name)r))rrV)Z wrap_in_text) r]rZ is_literalr'Z_sqlalchemy_autogenerate_prefixrVrrr)r rtemplaterHrHrRr;s  r)l __future__rloggingr`typingrrrrrrr r r Z sqlalchemyr r rrrrNZsqlalchemy.dialects.postgresqlrrrZsqlalchemy.schemarZsqlalchemy.sql.elementsrrZsqlalchemy.sql.functionsrZsqlalchemy.typesrbaserrrrrrr r!r"rr#r$rYr&Z autogenerater'rr(r)Zoperations.baser*r+r,Zutil.sqla_compatr-r.r/r0Z$sqlalchemy.dialects.postgresql.arrayr1Z#sqlalchemy.dialects.postgresql.baser2Z%sqlalchemy.dialects.postgresql.hstorer3Z#sqlalchemy.dialects.postgresql.jsonr4r5r6r7r8Zsqlalchemy.sql.schemar9r:Zsqlalchemy.sql.type_apir;r<Zautogenerate.apir=Zautogenerate.renderr>Zruntime.migrationr? getLoggerrr~r@rurrrrZregister_operationZAddConstraintOpZregister_add_constraintrZ renderersZ dispatch_forrZ_constraint_renderersrrrrrHrHrHrRs                                                             -   "   ?