o 3a@sddlZddlmZddlmZmZmZmZmZmZddl m Z m Z ddl m Z mZddlmZddlmZmZddlmZed Zd d Zd d ZddZGdddZdS)N)datetime)Columns ExpressionsForeignKeyName IndexName StatementTable) names_digestsplit_identifier) DeferrableIndex)Query)TransactionManagementErroratomic)timezonezdjango.db.backends.schemacCs2|j}|jrdS|jr|jdgkrdS|j|jvS)zz When altering the given field, must constraints on its model from the given relation be temporarily dropped? FNT)field many_to_many primary_key to_fieldsname)relation altered_fieldrr@/usr/lib/python3/dist-packages/django/db/backends/base/schema.py_is_relevant_relations  rcCs|jjddddS)NFT)forwardreverseinclude_hidden)_meta _get_fieldsmodelrrr_all_related_fields r"cs2tfddtjDfddtjDS)Nc3|] }t|r|VqdSNr.0obj) old_fieldrr (z+_related_non_m2m_objects..c3r$r%r&r') new_fieldrrr+)r,)zipr"r!)r*r-r)r-r*r_related_non_m2m_objects$sr/c @seZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d ZeZd ZdZdZdZdZdZdZdZdZeZdZeZdZdZdZeZdZ dZ!dZ"dZ#eZ$dZ%dd d!Z&d"d#Z'd$d%Z(dd'd(Z)d)d*Z*d+d,Z+dd-d.Z,d/d0Z-d1d2Z.d3d4Z/d5d6Z0e1d7d8Z2d9d:Z3d;d<Z4d=d>Z5d?d@Z6dAdBZ7dCdDZ8dEdFZ9dGdHZ:dIdJZ;dKdLZdQdRZ?dSdTZ@dUdVZAddWdXZB ddYdZZCd[d\ZDdd]d^ZEd_d`ZFdadbZGdcddZHddfdgZIddhdiZJdjdkZKdldmZLdddededd&dd&ddddn dodpZMddqdrZNdsdtZOdudvZPdwdxZQdydzZRd{d|ZSd}d~ZTddZUddZVddZWddZXddZYddZZ  dddZ[  dddZ\  dddZ]ddZ^ddZ_ddZ`ddZa   dddZbdddZcddZdddZeddZfdddZgdS)BaseDatabaseSchemaEditorz This class and its subclasses are responsible for emitting schema-changing statements to the databases - model creation/removal/alteration, field renaming, index fiddling, and so on. z'CREATE TABLE %(table)s (%(definition)s)z1ALTER TABLE %(old_table)s RENAME TO %(new_table)sz7ALTER TABLE %(table)s SET TABLESPACE %(new_tablespace)szDROP TABLE %(table)s CASCADEz:ALTER TABLE %(table)s ADD COLUMN %(column)s %(definition)sz!ALTER TABLE %(table)s %(changes)sz%ALTER COLUMN %(column)s TYPE %(type)sz%ALTER COLUMN %(column)s DROP NOT NULLz$ALTER COLUMN %(column)s SET NOT NULLz/ALTER COLUMN %(column)s SET DEFAULT %(default)sz$ALTER COLUMN %(column)s DROP DEFAULTz2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sz4ALTER TABLE %(table)s DROP COLUMN %(column)s CASCADEzDALTER TABLE %(table)s RENAME COLUMN %(old_column)s TO %(new_column)szFUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULLz"UNIQUE (%(columns)s)%(deferrable)szCHECK (%(check)s)z.ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz"CONSTRAINT %(name)s %(constraint)sz?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)zPALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE (%(columns)s)%(deferrable)sz|ALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s (%(to_column)s)%(deferrable)sNzQCREATE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(extra)s%(condition)szOCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(condition)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sFTcCs,||_||_|jr g|_|jjjo||_dSr%) connection collect_sql collected_sqlfeaturescan_rollback_ddlatomic_migration)selfr1r2rrrr__init__cs z!BaseDatabaseSchemaEditor.__init__cCs(g|_|jrt|jj|_|j|Sr%) deferred_sqlr6rr1alias __enter__r7rrrr;ls  z"BaseDatabaseSchemaEditor.__enter__cCs<|dur|jD]}||q|jr|j|||dSdSr%)r9executer6r__exit__)r7exc_type exc_value tracebacksqlrrrr>ss   z!BaseDatabaseSchemaEditor.__exit__rcCs|js|jjr|jjjstdt|}tjd||||dd|jrL| dr*dnd}|durB|j |t t |j||dS|j ||dS|j}|||WddS1scwYdS)z:Execute the given SQL statement, with optional parameters.ziExecuting DDL statements while in a transaction on databases that can't perform a rollback is prohibited.z%s; (params %r))paramsrB)extra;N)r2r1in_atomic_blockr4r5rstrloggerdebugendswithr3appendtuplemap quote_valuecursorr=)r7rBrCendingrPrrrr=|s$ "z BaseDatabaseSchemaEditor.executecCs|jj|Sr%)r1ops quote_name)r7rrrrrSz#BaseDatabaseSchemaEditor.quote_namecsjjD]}fdd|D}j|qg}g}jjD]}|\}}|dur1q"|jjd} | drE|dj | 7}|j jd} | rT|d| 7}| ||j r|j r|j jjj} |j jj|j jj} jr|dj| | d7}njjjrj|d |d |j|f|d vrjjjj|j} | rj | q"fd djjD}jjjd ddg||RDd}jjrjjjj}|r|d|7}||fS)z-Take a model and return its table definition.cg|] }j|jqSrr get_fieldcolumnr(rr rr z6BaseDatabaseSchemaEditor.table_sql..Nr1check  %s)to_table to_column_fk_%(to_table)s_%(to_column)sz%s %s) AutoField BigAutoFieldSmallAutoFieldcsg|]}|qSr)constraint_sqlr( constraintr!r7rrrZ, css|]}|r|VqdSr%rrgrrrr+sz5BaseDatabaseSchemaEditor.table_sql..)table definition) runique_togetherr9rL_create_unique_sql local_fields column_sql db_parametersr1sql_check_constraintdb_type_suffixextend remote_field db_constraintr!db_tablerW field_namerXsql_create_inline_fkrSr4supports_foreign_keys_create_fk_sqlget_internal_typerR autoinc_sql constraintssql_create_tablejoin db_tablespacetablespace_sql)r7r!fieldscolumns column_sqlsrCrrm extra_params db_paramscol_type_suffixr`rar~rrBrrrir table_sqlsZ            z"BaseDatabaseSchemaEditor.table_sqlc Cs^|j|jd}|d}g}|durdSt|dd}|r"|||7}|j}|o4|| o4|o3|| }|r_||} d||} | dur_|jj j rV|| | | 7}n || 7}|| g7}|j rl|j sl|jj jrld}|rx|jj jsx|d7}n|s~|d 7}|j r|d 7}n|jr|d 7}|jp|jj} | r|jj jr|jr|d |jjj| dd 7}||fS)z Take a field and return its column definition. The field must already have had set_attributes_from_name() called. r\typeN)NN db_collationz DEFAULT Tz NULLz NOT NULLz PRIMARY KEYz UNIQUEr_)inline)rrr1getattr _collate_sqlnull skip_defaultskip_default_on_altereffective_default_column_default_sqlr4requires_literal_defaultsprepare_defaultempty_strings_allowedr!interprets_empty_strings_as_nullsimplied_column_nulluniquerrsupports_tablespacesrRr) r7r!rinclude_defaultrrBrC collationr default_valuecolumn_default tablespacerrrrqsL        z#BaseDatabaseSchemaEditor.column_sqlcCdS)z Some backends don't accept default values for certain columns types (i.e. MySQL longtext and longblob). Frr7rrrrr z%BaseDatabaseSchemaEditor.skip_defaultcCr)z Some backends don't accept default values for certain columns types (i.e. MySQL longtext and longblob) in the ALTER COLUMN statement. Frrrrrrrz.BaseDatabaseSchemaEditor.skip_default_on_altercCstd)zU Only used for backends which have requires_literal_defaults feature zsubclasses of BaseDatabaseSchemaEditor for backends which have requires_literal_defaults must provide a prepare_default() methodNotImplementedErrorr7valuerrrrsz(BaseDatabaseSchemaEditor.prepare_defaultcCr)z Return the SQL to use in a DEFAULT clause. The resulting string should contain a '%s' placeholder for a default value. %srrrrrr$rz,BaseDatabaseSchemaEditor._column_default_sqlcCs|r |}|S|js!|jr!|jr!|dkrd}|Sd}|St|dds-t|ddrSt}|}|dkr?| }|S|dkrI| }|S|d krQt }|Sd}|S) N BinaryFieldrFauto_nowF auto_now_add DateField TimeField DateTimeField) has_default get_defaultrblankrr}rrnowdatetimer)rdefault internal_typerrr_effective_default+s.  z+BaseDatabaseSchemaEditor._effective_defaultcCs||||jS)z2Return a field's effective database default value.)get_db_prep_saverr1rrrrrBsz*BaseDatabaseSchemaEditor.effective_defaultcCst)aX Return a quoted version of the value so it's safe to use in an SQL string. This is not safe against injection from user code; it is intended only for use in making SQL scripts or preparing default values for particularly tricky backends (defaults are not user-defined, though, so this is safe). rrrrrrOFsz$BaseDatabaseSchemaEditor.quote_valuecCs\||\}}|||p d|j|||jjD]}|jjjj r+| |jjqdS)zr Create a table and any accompanying indexes or unique constraints for the given `model`. N) rr=r9ru_model_indexes_sqlrlocal_many_to_manyrvthrough auto_created create_model)r7r!rBrCrrrrrRs  z%BaseDatabaseSchemaEditor.create_modelcCs~|jjD]}|jjjjr||jjq||jd||jj it |j D]}t |t r<||jj r<|j |q(dS)z!Delete a model from the database.rlN)rrrvrr delete_modelr=sql_delete_tablerSrxlistr9 isinstancerreferences_tableremove)r7r!rrBrrrrcs   z%BaseDatabaseSchemaEditor.delete_modelcCs.|jr |jjjs dS|j|||dddS)zAdd an index on a model.NrC)contains_expressionsr1r4supports_expression_indexesr= create_sqlr7r!indexrrr add_indexss z"BaseDatabaseSchemaEditor.add_indexcCs*|jr |jjjs dS||||dS)zRemove an index from a model.N)rr1r4rr= remove_sqlrrrr remove_index~s z%BaseDatabaseSchemaEditor.remove_indexcCs&|||}|r|j|dddSdS)zAdd a constraint to a model.Nr)rr=r7r!rhrBrrradd_constraints z'BaseDatabaseSchemaEditor.add_constraintcCs"|||}|r||dSdS)z!Remove a constraint from a model.N)rr=rrrrremove_constraints z*BaseDatabaseSchemaEditor.remove_constraintcszdd|D}dd|D}||D] }||ddi|jq||D]}fdd|D}|||q&dS) z Deal with a model changing its unique_together. The input unique_togethers must be doubly-nested, not the single-nested ["foo", "bar"] format. cSh|]}t|qSrrMr(rrrr zABaseDatabaseSchemaEditor.alter_unique_together..cSrrrrrrrrrrTcrUrrVrYr rrrZr[zBBaseDatabaseSchemaEditor.alter_unique_together..N) difference_delete_composed_indexsql_delete_uniquer=ro)r7r!old_unique_togethernew_unique_togetheroldsnewsrrrr ralter_unique_togethersz.BaseDatabaseSchemaEditor.alter_unique_togethercsdd|D}dd|D}||D]}||ddd|jq||D]}fdd|D}||j|d d q'd S) z Deal with a model changing its index_together. The input index_togethers must be doubly-nested, not the single-nested ["foo", "bar"] format. cSrrrrrrrrrz@BaseDatabaseSchemaEditor.alter_index_together..cSrrrrrrrrrTF)rrcg|]}j|qSrrrWrYr rrrZrjzABaseDatabaseSchemaEditor.alter_index_together.._idxrsuffixN)rrsql_delete_indexr=_create_index_sql)r7r!old_index_togethernew_index_togetherrrr field_namesrr ralter_index_togethersz-BaseDatabaseSchemaEditor.alter_index_togetherc sddjjD}ddjjD}fdd|D}|j|fd||Bi|}t|dkr?tdt|jjd |f|| ||d dS) NcSh|]}|jqSrrrgrrrrzBBaseDatabaseSchemaEditor._delete_composed_index..cSrrrrgrrrrrcrUrrVrYr rrrZr[zCBaseDatabaseSchemaEditor._delete_composed_index..excludez1Found wrong number (%s) of constraints for %s(%s)rkr) rrindexes_constraint_nameslen ValueErrorrxrr=_delete_constraint_sql) r7r!rconstraint_kwargsrBmeta_constraint_namesmeta_index_namesrconstraint_namesrr rrs" z/BaseDatabaseSchemaEditor._delete_composed_indexcCsn||ks|jjjr||krdS||j||||d|jD] }t|t r4| ||q'dS)z#Rename the table a model points to.N) old_table new_table) r1r4ignores_table_name_caselowerr=sql_rename_tablerSr9rrrename_table_references)r7r! old_db_table new_db_tablerBrrralter_db_tables   z'BaseDatabaseSchemaEditor.alter_db_tablecCs2||j||jj||||ddS)z)Move a model's table between tablespaces.)rlold_tablespacenew_tablespaceN)r=sql_retablespace_tablerSrrx)r7r!old_db_tablespacenew_db_tablespacerrralter_db_tablespaces  z,BaseDatabaseSchemaEditor.alter_db_tablespacec Cs|jr|jjjjr||jjS|j||dd\}}|dur dS|j|jd}|dr4|d|j |7}|jr|jj j r|j rd}|j r|jjjj}|jjj|jjj}t|jj\} } |d|j ||||| rpd|| nd ||j|||||jjd 7}n |j|||||j||jj||j|d } || |||s||dur|j|d|dd \} }|j ||jj| d } || ||j!|"|||jj j#r|j$dSdS)z Create a field on a model. Usually involves adding a column, but may involve adding a table instead (for M2M fields). T)rNr\r]r^rbz%s.rF)r namespacerXr`ra deferrable)rlrXrmdroprlchanges)%rrvrrrrrqrrr1rsr4r{rwsql_create_column_inline_fkr!rxrWryrXr _fk_constraint_namerSrRdeferrable_sqlr9rLr|sql_create_columnr=rr_alter_column_default_sqlsql_alter_columnru_field_indexes_sqlconnection_persists_old_columnsclose) r7r!rrmrCrconstraint_suffixr`rar_rB changes_sqlrrr add_fieldsP           z"BaseDatabaseSchemaEditor.add_fieldcCs|jr|jjjjr||jjS|j|jdddurdS|jr8|j||j gdd}|D] }| | ||q,|j | |jj| |j d}| ||jjjrX|jt|jD]}t|trs||jj|j rs|j|q]dS)z Remove a field from a model. Usually involves deleting a column, but for M2Ms may involve deleting a table. r\rNT foreign_key)rlrX)rrvrrrrrrr1rrXr=_delete_fk_sqlsql_delete_columnrSrxr4rrrr9rrreferences_columnr)r7r!rfk_namesfk_namerBrrr remove_fields(      z%BaseDatabaseSchemaEditor.remove_fieldc Cs0|||sdS|j|jd}|d}|j|jd}|d}|dur'|jdus0|dur8|jdur8td||f|dur\|dur\|jjr\|jjr\|jjjjr\|jjjjr\|||||S|durz|durz|jjrz|jjrz|jjjjsz|jjjjszdS|dus|durtd||f| ||||||||dS)a' Allow a field's type, uniqueness, nullability, default, column, constraints, etc. to be modified. `old_field` is required to compute the necessary changes. If `strict` is True, raise errors if the old column does not match `old_field` precisely. Nr\rzqCannot alter field %s into %s - they do not properly define db_type (are you using a badly-written custom field?)zCannot alter field %s into %s - they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields)) _field_should_be_alteredrrr1rvrrrr_alter_many_to_many _alter_field) r7r!r*r-strict old_db_paramsold_type new_db_paramsnew_typerrr alter_field8sT     z$BaseDatabaseSchemaEditor.alter_fieldc )Cst} |jjjrC|jrC|jrC|j||jgdd} |r.t| dkr.t dt| |j j |jf| D]} | |jf| ||| q0|jr|jrO|||rdd|j jD} |j||jgdd| d} |rzt| dkrzt d t| |j j |jf| D] }| |||q||jjjo|jr|jp|jo|jo||k}|rt||D]\}}|j|j|jjgdd}|D] } | ||j| qq|jr|js|jr|jrd d|j jD}|j||jgdtj|d }|D] }| |||q|d |d kr=|d r=d d|j jD} |j||jgd| d} |r.t| dkr.t dt| |j j |jf| D] }| |||q0|j|jkri| ||j j ||||jD]}t|t rg|!|j j |j|jqTg}g}g}t"|dd}t"|dd}||kr|#||||}|$|n||kr|%||||\}}|$||&|d}|j'r|j's|(|}|(|} |)|s|| kr| durd}|$|*||||j'|j'kr|+|||}|r|$||,o|j'o|j' }!|s|ro|!s||}|jjj-r#|r#t.t/|\}}"d0|t1|"gfg}|D]\}}"| |j2|3|j j |d|"q%|!ro| |j4|3|j j |3|jdd| g|D]\}}"| |j2|3|j j |d|"qX|r|D] \}}"| ||"qt|jr|js|5|||6||r| |7||jg|jr|jr|jr|js| |j8||gdg}#|r|#&t|||||r| |9|||#&t|||#D]B\}$}|jj:|jd}%|%d}&|%|j|$j|j|&\}}| |j2|3|jj j |dd|d|D] \}}"| ||"qq|jjjrH|jrH| s:|jr:|jsH|jrH| |;||d|rk|j|'|ri|'jjri| |;|'j|'jdqP|d |d kr|d r|j?|j j |jgdd}| |@|||d |r|j*|||dd\}(}"|j2|3|j j |(d}| ||"|jjjAr|jBdSdS)z3Perform a "physical" (non-ManyToMany) field update.Trrz.F)rrrz7Found wrong number (%s) of unique constraints for %s.%scSrrr)r(rrrrrr)rtype_rr]cSrrrrgrrrrr)r]rz6Found wrong number (%s) of check constraints for %s.%srNrkr r)rlrXrrr\rrrb_fk_checkrr)Csetr1r4r{rvrwrrXrrrrxaddr=rr_field_became_primary_keyr_delete_unique_sqlrr/ related_modelrdb_indexrr r_delete_index_sql_delete_check_sql_rename_field_sqlr9rrrename_column_referencesr_alter_column_collation_sqlrL_alter_column_type_sqlrurrrr_alter_column_null_sqlrsupports_combined_altersrMr.rsumrrSsql_update_with_default_delete_primary_key_unique_should_be_addedror_create_primary_key_sqlrrr|r!related_objectsr_create_index_name_create_check_sqlrr))r7r!r*r-r&r(r%r'r$ fks_droppedrrrrconstraint_namedrop_foreign_keys_old_relnew_rel rel_fk_namesr index_names index_namerBactions null_actions post_actions old_collation new_collationfragment other_actionsneeds_database_default old_default new_defaultfour_way_default_alterationrCrels_to_updateold_rel rel_db_paramsrel_typerelrrrrr#cs                                    z%BaseDatabaseSchemaEditor._alter_fieldcCsX|jjjr |dvr dS|j|jd}|jr|jn|j}|||j |ddgfS)z Hook to specialize column null alteration. Return a (sql, params) fragment to set a column to null or non-null as required by new_field, or None if no changes are required. ) CharField TextFieldNr\rrXr) r1r4rr}rrrsql_alter_column_nullsql_alter_column_not_nullrSrX)r7r!r*r-r'rBrrrr;bs   z/BaseDatabaseSchemaEditor._alter_column_null_sqlc Cs||}||}|g}|rg}n |jjjr||}g}|j|jd}|r2|jr.|j} n|j } n|j } | | |j |d|d|fS)z Hook to specialize column default alteration. Return a (sql, params) fragment to add or drop (depending on the drop argument) a default to new_field's column. r\r)rXrr) rrr1r4rrrrr sql_alter_column_no_default_nullsql_alter_column_no_defaultsql_alter_column_defaultrSrX) r7r!r*r-r rVrrCr'rBrrrrxs*     z2BaseDatabaseSchemaEditor._alter_column_default_sqlcCs |j||j|dgfgfS)a Hook to specialize column type alteration for different backends, for cases when a creation type is different to an alteration type (e.g. SERIAL in PostgreSQL, PostGIS fields). Return a two-tuple of: an SQL fragment of (sql, params) to insert into an ALTER TABLE statement and a list of extra (sql, params) tuples to run once the field is altered. r_)sql_alter_column_typerSrX)r7r!r*r-r(rrrr:s z/BaseDatabaseSchemaEditor._alter_column_type_sqlcCs,|j||j||r||nddgfS)NrF)rXrr)sql_alter_column_collaterSrXr)r7r!r-r(rQrrrr9s z4BaseDatabaseSchemaEditor._alter_column_collation_sqlcCs|jjjj|jjjjkr||jj|jjjj|jjjj||jj|jjj||jjj|||jj|jjj||jjj|dS)z*Alter M2Ms to repoint their to= endpoints.N) rvrrrxrr)rWm2m_reverse_field_namem2m_field_name)r7r!r*r-r$rrrr"s z,BaseDatabaseSchemaEditor._alter_many_to_manyrFc Cst|\}}dt|g|Rddi|f}|jjpd}d|d||f}t||kr/|St||dkr?|d|d}|t|d d }d|d|d|d||f}|d dksg|d rod |dd }|S)z Generate a unique name for an index/unique constraint. The name is divided into 3 parts: the table name, the column names, and a unique digest and suffix. z%s%slengthz%s_%s_%srNrrzD%s)r r r1rRmax_name_lengthrrisdigit) r7 table_name column_namesrrhash_suffix_part max_lengthrL other_lengthrrrrCs"   z+BaseDatabaseSchemaEditor._create_index_namecCsX|durt|dkr|djr|dj}n|jjr|jj}|dur*d|jj|SdS)Nrrr^rF)rrrr1rRr)r7r!rrrrr_get_index_tablespace_sqls z2BaseDatabaseSchemaEditor._get_index_tablespace_sqlcCs|rd|SdS)Nz WHERE rFr)r7 conditionrrr_index_condition_sqlsz-BaseDatabaseSchemaEditor._index_condition_sqlcCs,|r|jjjs dStdt|jj||jdS)NrFz INCLUDE (%(columns)s))r)r1r4supports_covering_indexesrrrrxrS)r7r!rrrr_index_include_sqls z+BaseDatabaseSchemaEditor._index_include_sql) rrrusingr col_suffixesrB opclassesrwinclude expressionsc  s|pg}| pg} t|ddjjd} j|||d}dd|D}|p&j}|jj}fdd}t|t|j t ||||||rJ |||| nt || | j || || d S) z Return the SQL statement to create the index for one or several fields or expressions. `sql` can be specified if the syntax differs from the standard (GIS indexes, ...). F) alias_colsr\)rcSsg|]}|jqSr)rXrYrrrrZrz>BaseDatabaseSchemaEditor._create_index_sql..cs"dur j|i|Sr%)rCrSargskwargsrr7rrcreate_index_names zEBaseDatabaseSchemaEditor._create_index_sql..create_index_name)rlrr{rrDrwr~)r get_compilerr1rvsql_create_indexrrxrrrSr_index_columnsrrOrxrz)r7r!rrrr{rr|rBr}rwr~rcompilerrrrrlrrrrrs,     z*BaseDatabaseSchemaEditor._create_index_sqlcCs&t|p|jt|jj|j||dSN)rlr)rrrrrxrS)r7r!rrBrrrr5,s z*BaseDatabaseSchemaEditor._delete_index_sqlcCst|||j|dS)N)r|)rrS)r7rlrr|r}rrrr3r#z'BaseDatabaseSchemaEditor._index_columnscsjjr jjs jjrgSg}jjD] }|||qjjD]}fdd|D}||j |ddq$jj D]}|j rI|j j jrR|||q?|S)z Return a list of all index SQL statements (field indexes, index_together, Meta.indexes) for the specified model. crrrrYr rrrZBrjz?BaseDatabaseSchemaEditor._model_indexes_sql..rr)rmanagedproxyswappedrprurindex_togetherrLrrrr1r4rr)r7r!outputrrrrrr rr6s    z+BaseDatabaseSchemaEditor._model_indexes_sqlcCs*g}|||r||j||gd|S)zT Return a list of all index SQL statements for the specified field. r+)_field_should_be_indexedrLr)r7r!rrrrrrMs z+BaseDatabaseSchemaEditor._field_indexes_sqlc Csv|\}}}}|\}}}} gd} | D]} || d| | dq||j||jkp:|||f||| fkS)N) r db_columneditableerror_messages help_textlimit_choices_to on_delete related_namerelated_query_name validators verbose_name) deconstructpoprSrX) r7r*r-rold_pathold_args old_kwargsnew_pathnew_args new_kwargsnon_database_attrsattrrrrr!Vs z1BaseDatabaseSchemaEditor._field_should_be_alteredcCs|jo|j Sr%)r4rr7r!rrrrrsrTz1BaseDatabaseSchemaEditor._field_should_be_indexedcCs|j o|jSr%rr7r*r-rrrr1vrTz2BaseDatabaseSchemaEditor._field_became_primary_keycCs"|j r|jp|jo|j o|jSr%)rrrrrrr@ysz0BaseDatabaseSchemaEditor._unique_should_be_addedcCs*|j||||j||j|dS)N)rl old_column new_columnr)sql_rename_columnrSrX)r7rlr*r-r(rrrr7~s   z*BaseDatabaseSchemaEditor._rename_field_sqlc Cst|jj|j}||||}t|jj|jg|j}t|jjjj|j}t|jjjj|jjg|j}|j j } t |j |||||| dS)N)rlrrXr`rar)rrrxrSr rrX target_fieldr!r1rRrr sql_create_fk) r7r!rrrlrrXr`rarrrrr|s z'BaseDatabaseSchemaEditor._create_fk_sqlcs<fdd}t|jj|jgt|jjjjd|jjg||S)Ncj|i|Sr%rSrCrr<rrcreate_fk_namezDBaseDatabaseSchemaEditor._fk_constraint_name..create_fk_namer)rrrxrXr rr!)r7r!rrrrr<rr s z,BaseDatabaseSchemaEditor._fk_constraint_namecC||j||Sr%)r sql_delete_fkr7r!rrrrrz'BaseDatabaseSchemaEditor._delete_fk_sqlcCs,|durdS|tjkr dS|tjkrdSdS)NrFz DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r DEFERRED IMMEDIATE)r7rrrr_deferrable_constraint_sqls  z3BaseDatabaseSchemaEditor._deferrable_constraint_sqlc Cs|r |jjjs dS|s|s|r$|j||||||d}|r"|j|dS|jdt|j || |d} |j | || dS)N)rrwr~r}rk)rrrrh) r1r4&supports_deferrable_unique_constraintsror9rLsql_unique_constraintrrNrSrsql_constraint) r7r!rrrwrr~r}rBrhrrr _unique_sqls2  z$BaseDatabaseSchemaEditor._unique_sqlc s|rjjjr|rjjjr|rjjjsdSfdd}t|jjj} |dur3t |jj|d|}n|}j | |d|d}|sG|sG|rKj } nj } t | | ||||||dS)Ncrr%rrr<rrcreate_unique_namerzGBaseDatabaseSchemaEditor._create_unique_sql..create_unique_name_uniqr)r|r})rlrrrwrr~)r1r4rsupports_partial_indexesryrrrxrSrrsql_create_unique_indexsql_create_uniquerrxrrz) r7r!rrrwrr~r}rrlrBrr<rros>    z+BaseDatabaseSchemaEditor._create_unique_sqlcCsV|r|jjjr|r|jjjr|r|jjjsdS|s|s|r!|j}n|j}||||Sr%)r1r4rrryrrr)r7r!rrwrr~r}rBrrrr2s" z+BaseDatabaseSchemaEditor._delete_unique_sqlcCs |j|||jd|idS)Nr]r)rrSrs)r7rr]rrr _check_sqls z#BaseDatabaseSchemaEditor._check_sqlcCs$t|jt|jj|j|||dS)N)rlrr])rsql_create_checkrrrxrS)r7r!rr]rrrrD s z*BaseDatabaseSchemaEditor._create_check_sqlcCrr%)rsql_delete_checkrrrrr6rz*BaseDatabaseSchemaEditor._delete_check_sqlcCs t|t|jj|j||dSr)rrrrxrS)r7templater!rrrrrs z/BaseDatabaseSchemaEditor._delete_constraint_sqlc s|dur fdd|D}j} jj| |jj} Wdn1s'wYg} | D]Y\} }|dus@||dkr|durK|d|krKq2|durV|d|krVq2|dura|d|kraq2|durl|d|krlq2|duru|d suq2|dur|d |krq2| r| | vr| | q2| S) z@Return all constraint names matching the columns and conditions.Ncsg|] }jj|qSr)r1 introspectionidentifier_converter)r(rr<rrrZ$s z>BaseDatabaseSchemaEditor._constraint_names..rrrrr]rr)r1rPrget_constraintsrrxitemsrL)r7r!rrrrrrr]r*rrPrresultrinfodictrr<rrs4    z*BaseDatabaseSchemaEditor._constraint_namescCsV|j|dd}|rt|dkrtdt||jjf|D] }||||qdS)NTrrz0Found wrong number (%s) of PK constraints for %s)rrrrrxr=_delete_primary_key_sql)r7r!r$rrFrrrr?=sz,BaseDatabaseSchemaEditor._delete_primary_keyc CsJt|jt|jj|j||j|jj|jgddt|jj|jg|jdS)N_pkr.)rlrr) r sql_create_pkrrrxrSrCrXrrrrrrAGsz0BaseDatabaseSchemaEditor._create_primary_key_sqlcCrr%)r sql_delete_pkrrrrrQrz0BaseDatabaseSchemaEditor._delete_primary_key_sqlcCsd||S)Nz COLLATE )rS)r7rrrrrTrTz%BaseDatabaseSchemaEditor._collate_sqlcCs*|j||d|d}||dS)N,) procedure param_types)sql_delete_procedurerSrr=)r7procedure_namerrBrrrremove_procedureWs z)BaseDatabaseSchemaEditor.remove_procedure)FT)r)F)rFr%)NNNN)NNNNN)NNNNNNNN)h__name__ __module__ __qualname____doc__rrrrrrrer`rardrcrbrfrrr>rrssql_delete_constraintrrrrrrrzr rrrrrrrr8r;r>r=rSrrqrrrr staticmethodrrrOrrrrrrrrrrrrr r)r#r;rr:r9r"rCrvrxrzrr5rrrr!rr1r@r7r|r rrrror2rrDr6rrr?rArrrrrrrr0-s    ;<     9 ,  %    '    ! &    r0)loggingr!django.db.backends.ddl_referencesrrrrrrdjango.db.backends.utilsr r django.db.modelsr r django.db.models.sqlr django.db.transactionrr django.utilsr getLoggerrIrr"r/r0rrrrs