o
    ˜¨Êh: ã                   @   sÄ   d dl Z d dlZd dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZ e  d
¡Zdd„ Zdd„ Zdd„ ZG dd„ dƒZdS )é    N)Údatetime)Úsettings)ÚColumnsÚExpressionsÚForeignKeyNameÚ	IndexNameÚ	StatementÚTable)Únames_digestÚsplit_identifier)Ú
DeferrableÚIndex)ÚQuery)ÚTransactionManagementErrorÚatomic)Útimezonezdjango.db.backends.schemac                 C   s2   | j }|jrdS |jr|jdgkrdS |j|jv S )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_fieldsÚname)ÚrelationÚaltered_fieldr   © r   úP/var/www/html/env/lib/python3.10/site-packages/django/db/backends/base/schema.pyÚ_is_relevant_relation   s   r   c                 C   s"   t | jjddddd�t d¡d�S )NFT)ÚforwardÚreverseÚinclude_hiddenÚinclude_parentsr   )Úkey)ÚsortedÚ_metaÚ_get_fieldsÚoperatorÚ
attrgetter©Úmodelr   r   r   Ú_all_related_fields'   s   üùr(   c                 #   sd   � t ‡fdd„tˆjƒD ƒ‡ fdd„tˆ jƒD ƒƒ}|D ]\}}||fV  t|j|jƒE d H  qd S )Nc                 3   ó   � | ]
}t |ˆ ƒr|V  qd S ©N©r   ©Ú.0Úobj)Ú	old_fieldr   r   Ú	<genexpr>8   ó   € ý
ÿz+_related_non_m2m_objects.<locals>.<genexpr>c                 3   r)   r*   r+   r,   )Ú	new_fieldr   r   r0   =   r1   )Úzipr(   r'   Ú_related_non_m2m_objectsÚremote_field)r/   r2   Úrelated_fieldsÚold_relÚnew_relr   )r2   r/   r   r4   4   s    €
þ
þú
þþr4   c                   @   s4  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZeZdZdZdZdZdZdZdZdZdZeZdZeZdZdZdZeZdZ dZ!dZ"dZ#dZ$eZ%dZ&d®d!d"„Z'd#d$„ Z(d%d&„ Z)d¯d(d)„Z*d*d+„ Z+d,d-„ Z,d.d/„ Z-d°d0d1„Z.d2d3„ Z/d4d5„ Z0d6d7„ Z1d8d9„ Z2e3d:d;„ ƒZ4d<d=„ Z5d>d?„ Z6d@dA„ Z7dBdC„ Z8dDdE„ Z9dFdG„ Z:dHdI„ Z;dJdK„ Z<dLdM„ Z=dNdO„ Z>dPdQ„ Z?dRdS„ Z@dTdU„ ZAdVdW„ ZBdXdY„ ZCdZd[„ ZDd°d\d]„ZE	d°d^d_„ZFd`da„ ZGd°dbdc„ZHddde„ ZIdfdg„ ZJdhdi„ ZKd±dkdl„ZLd²dmdn„ZMdodp„ ZNdqdr„ ZOdddjdjdd'dd'ddddsœdtdu„ZPd²dvdw„ZQdxdy„ ZRdzd{„ ZSd|d}„ ZTd~d„ ZUd€d�„ ZVd‚dƒ„ ZWd„d…„ ZXd†d‡„ ZYdˆd‰„ ZZdŠd‹„ Z[dŒd�„ Z\dŽd�„ Z]d�d‘„ Z^					d³d’d“„Z_						d´d”d•„Z`dµd–d—„Za					d³d˜d™„Zbdšd›„ Zcdœd�„ ZddždŸ„ Zed d¡„ Zf								d¶d¢d£„Zgd°d¤d¥„Zhd¦d§„ Zid¨d©„ Zjdªd«„ Zkd¯d¬d­„ZldS )·Ú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)szDROP 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)szCHECK (%(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)sz/ALTER INDEX %(old_name)s RENAME TO %(new_name)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sFTc                 C   s,   || _ || _| jrg | _| j jjo|| _d S r*   )Ú
connectionÚcollect_sqlÚcollected_sqlÚfeaturesÚcan_rollback_ddlÚatomic_migration)Úselfr:   r;   r   r   r   r   Ú__init__‘   s
   z!BaseDatabaseSchemaEditor.__init__c                 C   s(   g | _ | jrt| jjƒ| _| j ¡  | S r*   )Údeferred_sqlr?   r   r:   ÚaliasÚ	__enter__©r@   r   r   r   rD   š   s
   
z"BaseDatabaseSchemaEditor.__enter__c                 C   s<   |d u r| j D ]}|  |¡ q| jr| j |||¡ d S d S r*   )rB   Úexecuter?   r   Ú__exit__)r@   Úexc_typeÚ	exc_valueÚ	tracebackÚsqlr   r   r   rG   ¡   s   
ÿz!BaseDatabaseSchemaEditor.__exit__r   c                 C   sØ   | j s| jjr| jjjstdƒ‚t|ƒ}tjd||||dœd� | j rN| 	¡  
d¡r,dnd}|durD| j |tt| j|ƒƒ | ¡ dS | j || ¡ dS | j ¡ �}| ||¡ W d  ƒ dS 1 sew   Y  dS )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))ÚparamsrK   )Úextraú;Ú N)r;   r:   Úin_atomic_blockr=   r>   r   ÚstrÚloggerÚdebugÚrstripÚendswithr<   ÚappendÚtupleÚmapÚquote_valueÚcursorrF   )r@   rK   rL   ÚendingrZ   r   r   r   rF   ª   s.   ÿþýÿÿÿ"ÿz BaseDatabaseSchemaEditor.executec                 C   s   | j j |¡S r*   )r:   ÚopsÚ
quote_name)r@   r   r   r   r   r]   É   ó   z#BaseDatabaseSchemaEditor.quote_namec                    sø  ˆ j jD ]}‡ fdd„|D ƒ}ˆj ˆ ˆ |¡¡ qg }g }ˆ j jD ]š}ˆ ˆ |¡\}}|du r1q"|jˆjd�}	|	d rE|dˆj	|	  7 }|j
ˆjd�}
|
rT|d|
 7 }| |¡ |jr–|jr–|jjj j}|jjj  |jj¡j}ˆjr†|dˆjˆ |¡ˆ |¡dœ  7 }nˆjjjr–ˆj ˆ ˆ |d	¡¡ | d
ˆ |j¡|f ¡ | ¡ dv r¼ˆjj ˆ j j|j¡}|r¼ˆj |¡ q"‡ ‡fdd„ˆ j jD ƒ}ˆjˆ ˆ j j¡d dd„ g |¢|¢R D ƒ¡dœ }ˆ j jrøˆjj ˆ j j¡}|rø|d| 7 }||fS )z-Take a model and return its table definition.c                    ó   g | ]}ˆ j  |¡‘qS r   ©r"   Ú	get_field©r-   r   r&   r   r   Ú
<listcomp>Ñ   ó    z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>N©r:   Úcheckú z %s)Úto_tableÚ	to_columnú_fk_%(to_table)s_%(to_column)sz%s %s)Ú	AutoFieldÚBigAutoFieldÚSmallAutoFieldc                    s   g | ]}|  ˆ ˆ¡‘qS r   )Úconstraint_sql©r-   Ú
constraint©r'   r@   r   r   rc   	  s    
ÿÿú, c                 s   s   � | ]}|r|V  qd S r*   r   ro   r   r   r   r0     s   € ÿ
ÿz5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>)ÚtableÚ
definition) r"   Úunique_togetherrB   rV   Ú_create_unique_sqlÚlocal_fieldsÚ
column_sqlÚdb_parametersr:   Úsql_check_constraintÚdb_type_suffixÚextendr5   Údb_constraintr'   Údb_tablera   Ú
field_nameÚcolumnÚsql_create_inline_fkr]   r=   Úsupports_foreign_keysÚ_create_fk_sqlÚget_internal_typer\   Úautoinc_sqlÚconstraintsÚsql_create_tableÚjoinÚdb_tablespaceÚtablespace_sql)r@   r'   Úfield_namesÚfieldsÚcolumn_sqlsrL   r   rt   Úextra_paramsÚ	db_paramsÚcol_type_suffixrh   ri   r…   r†   rK   rŠ   r   rq   r   Ú	table_sqlÌ   s€   

ÿþþ
ÿÿ
þÿÿ	
ÿ€þ
ÿþÿz"BaseDatabaseSchemaEditor.table_sqlc                 c   s.  � |V  |  d¡ }r|  |¡V  |j}|o#|  |¡ o#|o"|  |¡ }|rL|  |¡}	|	d urLd|  |¡ }
| jjj	rD|
|  
|	¡ V  n|
V  | |	¡ |jrY|jsY| jjjrYd}|s_dV  n| jjjsgdV  |jrndV  n|jrtdV  |jpz|jj}|r‘| jjjr“|jr•| jjj|dd�V  d S d S d S d S )	NÚ	collationzDEFAULT TzNOT NULLÚNULLzPRIMARY KEYÚUNIQUE)Úinline)ÚgetÚ_collate_sqlÚnullÚskip_defaultÚskip_default_on_alterÚeffective_defaultÚ_column_default_sqlr:   r=   Úrequires_literal_defaultsÚprepare_defaultrV   Úempty_strings_allowedr   Ú!interprets_empty_strings_as_nullsÚimplied_column_nullÚuniquer‰   r"   Úsupports_tablespacesr\   rŠ   )r@   Úcolumn_db_typerL   r'   r   Úfield_db_paramsÚinclude_defaultr’   r˜   Údefault_valueÚcolumn_defaultÚ
tablespacer   r   r   Ú_iter_column_sql  sT   €
ÿù	


ÿþý
ÿþýûz)BaseDatabaseSchemaEditor._iter_column_sqlc              
   C   sD   |j | jd�}|d }|du rdS g }d |  ||||||¡¡|fS )z†
        Return the column definition for a field. The field must already have
        had set_attributes_from_name() called.
        re   ÚtypeN)NNrg   )ry   r:   rˆ   rª   )r@   r'   r   r¦   r¥   r¤   rL   r   r   r   rx   T  s"   úþôz#BaseDatabaseSchemaEditor.column_sqlc                 C   ó   dS )z�
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob).
        Fr   ©r@   r   r   r   r   r™   o  ó   z%BaseDatabaseSchemaEditor.skip_defaultc                 C   r¬   )zŸ
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob) in the ALTER COLUMN statement.
        Fr   r­   r   r   r   rš   v  r®   z.BaseDatabaseSchemaEditor.skip_default_on_alterc                 C   s   t dƒ‚)zU
        Only used for backends which have requires_literal_defaults feature
        z€subclasses of BaseDatabaseSchemaEditor for backends which have requires_literal_defaults must provide a prepare_default() method©ÚNotImplementedError©r@   Úvaluer   r   r   rž   }  s   ÿz(BaseDatabaseSchemaEditor.prepare_defaultc                 C   r¬   )z�
        Return the SQL to use in a DEFAULT clause. The resulting string should
        contain a '%s' placeholder for a default value.
        ú%sr   r­   r   r   r   rœ   †  r®   z,BaseDatabaseSchemaEditor._column_default_sqlc                 C   s®   |   ¡ r
|  ¡ }|S | js!| jr!| jr!|  ¡ dkrd}|S d}|S t| ddƒs-t| ddƒrS|  ¡ }|dkr;t ¡ }|S t	 ¡ }|dkrI| 
¡ }|S |d	krQ| ¡ }|S d }|S )
NÚBinaryFieldó    rO   Úauto_nowFÚauto_now_addÚDateTimeFieldÚ	DateFieldÚ	TimeField)Úhas_defaultÚget_defaultr˜   ÚblankrŸ   r„   Úgetattrr   Únowr   ÚdateÚtime)r   ÚdefaultÚinternal_typer   r   r   Ú_effective_default�  s.   ïóô	ùüÿz+BaseDatabaseSchemaEditor._effective_defaultc                 C   s   |  |  |¡| j¡S )z2Return a field's effective database default value.)Úget_db_prep_saverÄ   r:   r­   r   r   r   r›   ¥  s   z*BaseDatabaseSchemaEditor.effective_defaultc                 C   s   t ƒ ‚)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).
        r¯   r±   r   r   r   rY   ©  s   z$BaseDatabaseSchemaEditor.quote_valuec                 C   s\   |   |¡\}}|  ||pd¡ | j |  |¡¡ |jjD ]}|jjjj	r+|  
|jj¡ qdS )zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        N)r‘   rF   rB   r|   Ú_model_indexes_sqlr"   Úlocal_many_to_manyr5   ÚthroughÚauto_createdÚcreate_model)r@   r'   rK   rL   r   r   r   r   rÊ   µ  s   €þz%BaseDatabaseSchemaEditor.create_modelc                 C   s~   |j jD ]}|jjj jr|  |jj¡ q|  | jd|  |j j	¡i ¡ t
| jƒD ]}t|tƒr<| |j j	¡r<| j |¡ q(dS )z!Delete a model from the database.rs   N)r"   rÇ   r5   rÈ   rÉ   Údelete_modelrF   Úsql_delete_tabler]   r~   ÚlistrB   Ú
isinstancer   Úreferences_tableÚremove)r@   r'   r   rK   r   r   r   rË   È  s"   €ÿÿÿÿ€üz%BaseDatabaseSchemaEditor.delete_modelc                 C   s.   |j r
| jjjs
dS | j| || ¡dd� dS )zAdd an index on a model.N©rL   )Úcontains_expressionsr:   r=   Úsupports_expression_indexesrF   Ú
create_sql©r@   r'   Úindexr   r   r   Ú	add_indexÝ  s   ÿþz"BaseDatabaseSchemaEditor.add_indexc                 C   s*   |j r
| jjjs
dS |  | || ¡¡ dS )zRemove an index from a model.N)rÒ   r:   r=   rÓ   rF   Ú
remove_sqlrÕ   r   r   r   Úremove_indexè  s   ÿþz%BaseDatabaseSchemaEditor.remove_indexc                 C   sF   | j jjr| j|  ||j|j¡d d� d S |  ||¡ |  ||¡ d S )NrÑ   )r:   r=   Úcan_rename_indexrF   Ú_rename_index_sqlr   rÙ   r×   )r@   r'   Ú	old_indexÚ	new_indexr   r   r   Úrename_indexñ  s   

þz%BaseDatabaseSchemaEditor.rename_indexc                 C   s&   |  || ¡}|r| j|dd� dS dS )zAdd a constraint to a model.NrÑ   )rÔ   rF   ©r@   r'   rp   rK   r   r   r   Úadd_constraintû  s   ýz'BaseDatabaseSchemaEditor.add_constraintc                 C   s"   |  || ¡}|r|  |¡ dS dS )z!Remove a constraint from a model.N)rØ   rF   rß   r   r   r   Úremove_constraint  s   ÿz*BaseDatabaseSchemaEditor.remove_constraintc                    s|   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |dddœ| j¡ q|  |¡D ]}‡ fdd„|D ƒ}|  |  ˆ |¡¡ q'd	S )
z°
        Deal with a model changing its unique_together. The input
        unique_togethers must be doubly-nested, not the single-nested
        ["foo", "bar"] format.
        c                 S   ó   h | ]}t |ƒ’qS r   ©rW   ©r-   rŒ   r   r   r   Ú	<setcomp>  ó    zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>c                 S   râ   r   rã   rä   r   r   r   rå     ræ   TF)r¢   r   c                    r_   r   r`   rb   r&   r   r   rc     rd   zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>N)Ú
differenceÚ_delete_composed_indexÚsql_delete_uniquerF   rv   )r@   r'   Úold_unique_togetherÚnew_unique_togetherÚoldsÚnewsrŒ   r‹   r   r&   r   Úalter_unique_together	  s   üþz.BaseDatabaseSchemaEditor.alter_unique_togetherc                    s€   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |dddœ| j¡ q|  |¡D ]}‡ fdd„|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.
        c                 S   râ   r   rã   rä   r   r   r   rå   $  ræ   z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>c                 S   râ   r   rã   rä   r   r   r   rå   %  ræ   TF)rÖ   r¢   c                    r_   r   r`   rb   r&   r   r   rc   0  rd   zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>Ú_idx©rŒ   ÚsuffixN)rç   rè   Úsql_delete_indexrF   Ú_create_index_sql)r@   r'   Úold_index_togetherÚnew_index_togetherrì   rí   rŒ   r‹   r   r&   r   Úalter_index_together  s   üþz-BaseDatabaseSchemaEditor.alter_index_togetherc           
         sÜ   dd„ ˆ j jD ƒ}dd„ ˆ j jD ƒ}‡ fdd„|D ƒ}| jˆ |fd||B i|¤Ž}| d¡du rJ|rJ| jjjrJt| j	ˆ j j
|d	d
�ƒ}	|	|v rJ|	g}t|ƒdkr`tdt|ƒˆ j j
d |¡f ƒ‚|  |  |ˆ |d ¡¡ d S )Nc                 S   ó   h | ]}|j ’qS r   ©r   ro   r   r   r   rå   4  ó    ÿzBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>c                 S   r÷   r   rø   ro   r   r   r   rå   7  ó    c                    s   g | ]	}ˆ j  |¡j‘qS r   )r"   ra   r€   rb   r&   r   r   rc   8  s    zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>Úexcluder¢   TF©Úquoteé   z1Found wrong number (%s) of constraints for %s(%s)rr   r   )r"   r†   ÚindexesÚ_constraint_namesr–   r:   r=   Ú*allows_multiple_constraints_on_same_fieldsrQ   Ú_unique_constraint_namer~   ÚlenÚ
ValueErrorrˆ   rF   Ú_delete_constraint_sql)
r@   r'   rŒ   Úconstraint_kwargsrK   Úmeta_constraint_namesÚmeta_index_namesÚcolumnsÚconstraint_namesÚdefault_namer   r&   r   rè   3  sB   ÿþýüÿþÿýÿÿz/BaseDatabaseSchemaEditor._delete_composed_indexc                 C   sn   ||ks| j jjr| ¡ | ¡ krdS |  | j|  |¡|  |¡dœ ¡ | jD ]}t|t	ƒr4| 
||¡ q'dS )z#Rename the table a model points to.N)Ú	old_tableÚ	new_table)r:   r=   Úignores_table_name_caseÚlowerrF   Úsql_rename_tabler]   rB   rÎ   r   Úrename_table_references)r@   r'   Úold_db_tableÚnew_db_tablerK   r   r   r   Úalter_db_tableU  s"   ÿþÿÿ

€þz'BaseDatabaseSchemaEditor.alter_db_tablec                 C   s2   |   | j|  |jj¡|  |¡|  |¡dœ ¡ dS )z)Move a model's table between tablespaces.)rs   Úold_tablespaceÚnew_tablespaceN)rF   Úsql_retablespace_tabler]   r"   r~   )r@   r'   Úold_db_tablespaceÚnew_db_tablespacer   r   r   Úalter_db_tablespaceh  s   ýÿÿz,BaseDatabaseSchemaEditor.alter_db_tablespacec              
   C   sÞ  |j r|jjjjr|  |jj¡S | j||dd�\}}|du r dS |j| jd�}|d r4|d| j	|  7 }|jr•| jj
jr•|jr•d}| jrŠ|jjjj}|jjj |jj¡j}t|jjƒ\}	}
|d| j|  |||¡|	rpd|  |	¡ nd	|  |j¡|  |¡|  |¡| jj ¡ d
œ  7 }n| j |  |||¡¡ | j|  |jj¡|  |j¡|dœ }|  ||¡ |  |¡s×|  |¡dur×| j|d|dd�\}}| j |  |jj¡|dœ }|  ||¡ | j !|  "||¡¡ | jj
j#rí| j $¡  dS dS )z�
        Create a field on a model. Usually involves adding a column, but may
        involve adding a table instead (for M2M fields).
        T)r¦   Nre   rf   rg   rj   z%s.rO   )r   Ú	namespacer€   rh   ri   Ú
deferrable)rs   r€   rt   ©Údrop©rs   Úchanges)%r   r5   rÈ   r"   rÉ   rÊ   rx   ry   r:   rz   r=   r‚   r}   Úsql_create_column_inline_fkr'   r~   ra   r   r€   r   Ú_fk_constraint_namer]   r\   Údeferrable_sqlrB   rV   rƒ   Úsql_create_columnrF   rš   r›   Ú_alter_column_default_sqlÚsql_alter_columnr|   Ú_field_indexes_sqlÚconnection_persists_old_columnsÚclose)r@   r'   r   rt   rL   r�   Úconstraint_suffixrh   ri   r  Ú_rK   Úchanges_sqlr   r   r   Ú	add_fields  sr   ÿþý
ÿþÿ

øÿ
ýÿ
ÿþ
ÿz"BaseDatabaseSchemaEditor.add_fieldc                 C   sì   |j r|jjjjr|  |jj¡S |j| jd�d du rdS |jr8| j||j	gdd�}|D ]}|  
|  ||¡¡ q,| j|  |jj¡|  |j	¡dœ }|  
|¡ | jjjrX| j ¡  t| jƒD ]}t|tƒrs| |jj|j	¡rs| j |¡ q]dS )z…
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        re   r«   NT©Úforeign_key)rs   r€   )r   r5   rÈ   r"   rÉ   rË   ry   r:   r   r€   rF   Ú_delete_fk_sqlÚsql_delete_columnr]   r~   r=   r(  r)  rÍ   rB   rÎ   r   Úreferences_columnrÐ   )r@   r'   r   Úfk_namesÚfk_namerK   r   r   r   Úremove_field»  s,   
þ



ÿ€üz%BaseDatabaseSchemaEditor.remove_fieldc           	   
   C   s0  |   ||¡sdS |j| jd�}|d }|j| jd�}|d }|du r'|jdu s0|du r8|jdu r8td||f ƒ‚|du r\|du r\|jjr\|jjr\|jjjjr\|jjjjr\|  ||||¡S |du rz|du rz|jjrz|jjrz|jjjjsz|jjjjszdS |du s‚|du rŠtd||f ƒ‚|  	||||||||¡ dS )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.
        Nre   r«   zqCannot alter field %s into %s - they do not properly define db_type (are you using a badly-written custom field?)z�Cannot 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_alteredry   r:   r5   r  rÈ   r"   rÉ   Ú_alter_many_to_manyÚ_alter_field)	r@   r'   r/   r2   ÚstrictÚold_db_paramsÚold_typeÚnew_db_paramsÚnew_typer   r   r   Úalter_fieldÛ  sf   þÿþý
ü
ûþý
ü
û	þÿøz$BaseDatabaseSchemaEditor.alter_fieldc	           /      C   sè  t ƒ }	| jjjrC|jrC|jrC| j||jgdd�}
|r.t|
ƒdkr.t	dt|
ƒ|j
j|jf ƒ‚|
D ]}|	 |jf¡ |  |  ||¡¡ q0|jrˆ|jrO|  ||¡rˆdd„ |j
jD ƒ}| j||jgdd|d�}|rzt|ƒdkrzt	d	t|ƒ|j
j|jf ƒ‚|D ]}|  |  ||¡¡ q|| d
¡}| d
¡}| jjjoª|jr�|jp¢|jo¢|joª||kpª||k}|rÒt||ƒD ]\}}| j|j|jjgdd�}|D ]}|  |  |j|¡¡ qÄq²|j�r|j�s|jrá|j�rdd„ |j
jD ƒ}| j||jgdtj|d�}|D ]}|  |  ||¡¡ qù|d |d k�rN|d �rNdd„ |j
jD ƒ}| j||jgd|d�}|�r?t|ƒdk�r?t	dt|ƒ|j
j|jf ƒ‚|D ]}|  |  ||¡¡ �qA|j|jk�rz|  |  |j
j|||¡¡ | jD ]}t |t!ƒ�rx| "|j
j|j|j¡ �qeg }g }g }|j#| jd�}|j#| jd�}||k�r¡|  $||||¡}| %|¡ n||f||fk�r¾|  &||||¡\}}| %|¡ | '|¡ d} |j(�rî|j(�sî|  )|¡}!|  )|¡}"|  *|¡�sî|!|"k�rî|"du�rîd} | %|  +|||¡¡ |j(|j(k�r|  ,|||¡}|�r| %|¡ | -¡ �o|j(�o|j( }#|�s|�r†|#�s|| }| jjj.�r:|�r:t/t0|Ž ƒ\}}$d 1|¡t2|$g ƒfg}|D ]\}}$|  | j3|  4|j
j¡|dœ |$¡ �q<|#�r†|  | j5|  4|j
j¡|  4|j¡ddœ |"g¡ |D ]\}}$|  | j3|  4|j
j¡|dœ |$¡ �qo|�r—|D ]\}}$|  ||$¡ �q‹|j�r¥|j�s¥|  6||¡ |  7||¡�r¶|  |  8||g¡¡ |j�r¾|j�rÑ|j�rÑ|j�sÑ|  | j9||gd�¡ g }%|�rÞ|% 't||ƒ¡ |  ||¡�rö|  |  :||¡¡ |% 't||ƒ¡ |%D ]f\}&}|jj;| jd�}'|'d }(|' d
¡})|&jj;| jd�}*|* d
¡}+|+|)k�r,|  $|j|j|(|)¡}g }n|  &|j|&j|j|(¡\}}|  | j3|  4|jj
j¡|d dœ |d ¡ |D ]\}}$|  ||$¡ �qQ�qø| jjj�r‚|j�r‚|	�st|j�rt|j�s‚|j�r‚|  |  <||d¡¡ |�rž|%D ]\},}-|-jj�rœ|  |  <|-j|-jd¡¡ �q‡|d |d k�rÄ|d �rÄ| j=|j
j|jgdd�}|  |  >|||d ¡¡ | �rå| j+|||dd�\}.}$| j3|  4|j
j¡|.dœ }|  ||$¡ | jjj?�rò| j @¡  dS dS )z3Perform a "physical" (non-ManyToMany) field update.Tr.  rþ   z<Found wrong number (%s) of foreign key constraints for %s.%sc                 S   r÷   r   rø   ro   r   r   r   rå   B  rù   z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>F)r¢   r   rû   z7Found wrong number (%s) of unique constraints for %s.%sr’   c                 S   r÷   r   rø   )r-   rÖ   r   r   r   rå   |  rú   )rÖ   Útype_rû   rf   c                 S   r÷   r   rø   ro   r   r   r   rå   �  rù   )rf   rû   z6Found wrong number (%s) of check constraints for %s.%sre   Nrr   r  r³   )rs   r€   rÂ   ©rŒ   r«   r   rj   Ú_fkÚ_check©rñ   r  )AÚsetr:   r=   r‚   r5   r}   r   r€   r  r  r"   r~   ÚaddrF   r0  r¢   Ú_field_became_primary_keyr†   Ú_delete_unique_sqlr–   r   r4   Úrelated_modelr   Údb_indexrÿ   r   rñ   Ú_delete_index_sqlÚ_delete_check_sqlÚ_rename_field_sqlrB   rÎ   r   Úrename_column_referencesr{   Ú_alter_column_collation_sqlrV   Ú_alter_column_type_sqlr|   r˜   r›   rš   r%  Ú_alter_column_null_sqlr»   Úsupports_combined_altersrW   r3   rˆ   Úsumr&  r]   Úsql_update_with_defaultÚ_delete_primary_keyÚ_unique_should_be_addedrv   ró   Ú_create_primary_key_sqlry   rƒ   Ú_create_index_nameÚ_create_check_sqlr(  r)  )/r@   r'   r/   r2   r;  r=  r:  r<  r9  Úfks_droppedr3  r4  r  r
  Úconstraint_nameÚold_collationÚnew_collationÚdrop_foreign_keysÚ_old_relr8   Úrel_fk_namesr  Úindex_namesÚ
index_namerK   ÚactionsÚnull_actionsÚpost_actionsÚold_type_suffixÚnew_type_suffixÚfragmentÚother_actionsÚneeds_database_defaultÚold_defaultÚnew_defaultÚfour_way_default_alterationrL   Úrels_to_updater7   Úrel_db_paramsÚrel_typeÚrel_collationÚold_rel_db_paramsÚold_rel_collationr+  Úrelr,  r   r   r   r8    s&  ÿþý
ÿýÿÿÿ
ÿÿûýÿÿ



ýúÿÿÿþýýûÿüýÿÿÿÿ
ÿ€
ÿÿ



ÿ

ÿ

ÿþÿú
ýÿùþÿúÿÿþý


üÿþÿúÿÿþüüüúÿ
ÿ€ÿÿ
ÿþÿz%BaseDatabaseSchemaEditor._alter_fieldc                 C   sR   | j jjr
|jr
dS |j| j d�}|jr| jn| j}||  |j	¡|d dœ g fS )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.
        Nre   r«   ©r€   r«   )
r:   r=   r    rŸ   ry   r˜   Úsql_alter_column_nullÚsql_alter_column_not_nullr]   r€   )r@   r'   r/   r2   r<  rK   r   r   r   rP  t  s"   ÿþÿý
þÿúz/BaseDatabaseSchemaEditor._alter_column_null_sqlc           
      C   sŠ   |   |¡}|  |¡}|g}|rg }n| jjjr|  |¡}g }|j| jd�}|r2|jr.| j}	n| j	}	n| j
}	|	|  |j¡|d |dœ |fS )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.
        re   r«   )r€   r«   rÂ   )r›   rœ   r:   r=   r�   rž   ry   r˜   Ú sql_alter_column_no_default_nullÚsql_alter_column_no_defaultÚsql_alter_column_defaultr]   r€   )
r@   r'   r/   r2   r  rk  rÂ   rL   r<  rK   r   r   r   r%  ‘  s,   




ýÿùz2BaseDatabaseSchemaEditor._alter_column_default_sqlc                 C   s    | j |  |j¡|dœ g fg fS )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.
        rt  )Úsql_alter_column_typer]   r€   )r@   r'   r/   r2   r=  r   r   r   rO  ·  s   
þÿú÷z/BaseDatabaseSchemaEditor._alter_column_type_sqlc                 C   s0   | j |  |j¡||rd|  |¡ nddœ g fS )Nrg   rO   )r€   r«   r’   )Úsql_alter_column_collater]   r€   r—   )r@   r'   r2   r=  r\  r   r   r   rN  Í  s   
ÿûÿ÷z4BaseDatabaseSchemaEditor._alter_column_collation_sqlc                 C   s¢   |j jjj|j jjjkr|  |j j|j jjj|j jjj¡ |  |j j|j jj | ¡ ¡|j jj | ¡ ¡¡ |  |j j|j jj | ¡ ¡|j jj | ¡ ¡¡ dS )z*Alter M2Ms to repoint their to= endpoints.N)	r5   rÈ   r"   r~   r  r>  ra   Úm2m_reverse_field_nameÚm2m_field_name)r@   r'   r/   r2   r9  r   r   r   r7  Ú  s,   

ÿ

ý
ÿ
ÿøüz,BaseDatabaseSchemaEditor._alter_many_to_manyrO   c           	      C   sâ   t |ƒ\}}dt|g|¢R ddiŽ|f }| jj ¡ pd}d|d |¡|f }t|ƒ|kr/|S t|ƒ|d kr?|d|d … }|t|ƒ d	 d
 }d|d|… d |¡d|… |f }|d dksg|d  ¡ rod|dd…  }|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%sÚlengthé   éÈ   z%s_%s_%sr+  é   Né   rþ   r   zD%séÿÿÿÿ)r   r
   r:   r\   Úmax_name_lengthrˆ   r  Úisdigit)	r@   Ú
table_nameÚcolumn_namesrñ   r+  Úhash_suffix_partÚ
max_lengthra  Úother_lengthr   r   r   rW  ú  s(   þ
ýz+BaseDatabaseSchemaEditor._create_index_namec                 C   sf   |d u r$t |ƒdkr|d jr|d j}ntjrtj}n|jjr$|jj}|d ur1d| jj |¡ S dS )Nrþ   r   rg   rO   )r  r‰   r   ÚDEFAULT_INDEX_TABLESPACEr"   r:   r\   rŠ   )r@   r'   rŒ   r‰   r   r   r   Ú_get_index_tablespace_sql  s   z2BaseDatabaseSchemaEditor._get_index_tablespace_sqlc                 C   s   |rd| S dS )Nz WHERE rO   r   )r@   Ú	conditionr   r   r   Ú_index_condition_sql&  s   z-BaseDatabaseSchemaEditor._index_condition_sqlc                 C   s,   |r| j jjs	dS tdt|jj|| jƒd�S )NrO   z INCLUDE (%(columns)s))r	  )r:   r=   Úsupports_covering_indexesr   r   r"   r~   r]   )r@   r'   r	  r   r   r   Ú_index_include_sql+  s   þz+BaseDatabaseSchemaEditor._index_include_sql)rŒ   r   rñ   Úusingr‰   Úcol_suffixesrK   Ú	opclassesr�  ÚincludeÚexpressionsc                   s¼   |pg }|pg }t |dd�jˆjd�}ˆj|||d�}dd„ |D ƒ}|p&ˆj}|jj}‡ ‡fdd„}t|t|ˆj	ƒt
||||ƒ||rJˆ ||||	¡nt|||ˆ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_colsre   )r‰   c                 S   ó   g | ]}|j ‘qS r   ©r€   rb   r   r   r   rc   P  rú   z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>c                     s"   ˆ d u rˆj | i |¤Ž‰ ˆ ˆ ¡S r*   )rW  r]   ©ÚargsÚkwargs©r   r@   r   r   Úcreate_index_nameT  s   
zEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name)rs   r   r‘  r	  rM   r�  r”  )r   Úget_compilerr:   rŒ  Úsql_create_indexr"   r~   r   r	   r]   r   Ú_index_columnsr   rY   rŽ  r�  )r@   r'   rŒ   r   rñ   r‘  r‰   r’  rK   r“  r�  r”  r•  ÚcompilerrŠ   r	  r   rs   rž  r   r�  r   ró   3  s0   ÿÿ

ÿ
ôz*BaseDatabaseSchemaEditor._create_index_sqlc                 C   s&   t |p| jt|jj| jƒ|  |¡d�S ©N)rs   r   )r   rò   r	   r"   r~   r]   )r@   r'   r   rK   r   r   r   rJ  i  s
   ýz*BaseDatabaseSchemaEditor._delete_index_sqlc                 C   s*   t | jt|jj| jƒ|  |¡|  |¡d�S )N)rs   Úold_nameÚnew_name)r   Úsql_rename_indexr	   r"   r~   r]   )r@   r'   r¤  r¥  r   r   r   rÛ   p  s   üz*BaseDatabaseSchemaEditor._rename_index_sqlc                 C   s   t ||| j|d�S )N)r’  )r   r]   )r@   rs   r	  r’  r“  r   r   r   r¡  x  s   z'BaseDatabaseSchemaEditor._index_columnsc                    sª   ˆ j jrˆ j jsˆ j jrg S g }ˆ j jD ]}| |  ˆ |¡¡ qˆ j jD ]}‡ fdd„|D ƒ}| | j	ˆ |dd�¡ q$ˆ j j
D ]}|jrI| jjjrR| | ˆ | ¡¡ q?|S )zŠ
        Return a list of all index SQL statements (field indexes,
        index_together, Meta.indexes) for the specified model.
        c                    r_   r   r`   rb   r&   r   r   rc   ‡  rd   z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>rï   rð   )r"   ÚmanagedÚproxyÚswappedrw   r|   r'  Úindex_togetherrV   ró   rÿ   rÒ   r:   r=   rÓ   rÔ   )r@   r'   Úoutputr   r‹   rŒ   rÖ   r   r&   r   rÆ   {  s    ÿþ€z+BaseDatabaseSchemaEditor._model_indexes_sqlc                 C   s*   g }|   ||¡r| | j||gd�¡ |S )zT
        Return a list of all index SQL statements for the specified field.
        r@  )Ú_field_should_be_indexedrV   ró   )r@   r'   r   r«  r   r   r   r'  ’  s   z+BaseDatabaseSchemaEditor._field_indexes_sqlc                 C   s|   |  ¡ \}}}}|  ¡ \}}}}	|jD ]}
| |
d ¡ q|jD ]}
|	 |
d ¡ q|  |j¡|  |j¡kp=|||f|||	fkS r*   )ÚdeconstructÚnon_db_attrsÚpopr]   r€   )r@   r/   r2   r+  Úold_pathÚold_argsÚ
old_kwargsÚnew_pathÚnew_argsÚ
new_kwargsÚattrr   r   r   r6  ›  s   

ÿþz1BaseDatabaseSchemaEditor._field_should_be_alteredc                 C   s   |j o|j S r*   )rI  r¢   ©r@   r'   r   r   r   r   r¬  ª  r^   z1BaseDatabaseSchemaEditor._field_should_be_indexedc                 C   s   |j  o|j S r*   ©r   ©r@   r/   r2   r   r   r   rF  ­  r^   z2BaseDatabaseSchemaEditor._field_became_primary_keyc                 C   s   |j  o|jo|j p|j S r*   )r   r¢   r¹  r   r   r   rU  °  s
   ÿýz0BaseDatabaseSchemaEditor._unique_should_be_addedc                 C   s*   | j |  |¡|  |j¡|  |j¡|dœ S )N)rs   Ú
old_columnÚ
new_columnr«   )Úsql_rename_columnr]   r€   )r@   rs   r/   r2   r=  r   r   r   rL  ·  s   

üz*BaseDatabaseSchemaEditor._rename_field_sqlc           
   	   C   sˆ   t |jj| jƒ}|  |||¡}t|jj|jg| jƒ}t |jjjj| jƒ}t|jjjj|jjg| jƒ}| j	j
 ¡ }	t| j||||||	d�S )N)rs   r   r€   rh   ri   r  )r	   r"   r~   r]   r"  r   r€   Útarget_fieldr'   r:   r\   r#  r   Úsql_create_fk)
r@   r'   r   rñ   rs   r   r€   rh   ri   r  r   r   r   rƒ   ¿  s&   
ýùz'BaseDatabaseSchemaEditor._create_fk_sqlc                    s<   ‡ fdd„}t |jj|jgt|jjjjƒd |jjg||ƒS )Nc                     ó   ˆ   ˆ j| i |¤Ž¡S r*   ©r]   rW  rš  rE   r   r   Úcreate_fk_nameÕ  ó   zDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_namerþ   )r   r"   r~   r€   r   r½  r'   )r@   r'   r   rñ   rÁ  r   rE   r   r"  Ô  s   úz,BaseDatabaseSchemaEditor._fk_constraint_namec                 C   ó   |   | j||¡S r*   )r  Úsql_delete_fk©r@   r'   r   r   r   r   r0  á  ó   z'BaseDatabaseSchemaEditor._delete_fk_sqlc                 C   s,   |d u rdS |t jkrdS |t jkrdS d S )NrO   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   ÚDEFERREDÚ	IMMEDIATE)r@   r  r   r   r   Ú_deferrable_constraint_sqlä  s   

ÿz3BaseDatabaseSchemaEditor._deferrable_constraint_sqlc	              	      sŽ   |r	ˆ j jjs	d S |s|s|s|r'ˆ j|||||||d�}	|	r%ˆ j |	¡ d S ˆ jd ‡ fdd„|D ƒ¡ˆ  |¡dœ }
ˆ j	ˆ  
|¡|
dœ S )N)r   r�  r”  r“  r•  rr   c                    s   g | ]}ˆ   |j¡‘qS r   )r]   r€   rb   rE   r   r   rc     rd   z8BaseDatabaseSchemaEditor._unique_sql.<locals>.<listcomp>)r	  r  ©r   rp   )r:   r=   Ú&supports_deferrable_unique_constraintsrv   rB   rV   Úsql_unique_constraintrˆ   rÉ  Úsql_constraintr]   )r@   r'   rŒ   r   r�  r  r”  r“  r•  rK   rp   r   rE   r   Ú_unique_sqlì  s4   ÿþù	þþz$BaseDatabaseSchemaEditor._unique_sqlc	                 C   s  |r| j jjr|r| j jjr|r| j jjr|r| j jjsd S t|dd�j| j d�}	|jj	}
dd„ |D ƒ}|d u rA| j
|
|dd�}n|  |¡}|sN|sN|sN|rR| j}n| j}|ra| j|
|d|d	�}nt|
||	| jƒ}t|t|
| jƒ|||  |¡|  |¡|  ||¡d
�S )NFr–  re   c                 S   r˜  r   r™  rb   r   r   r   rc   0  rú   z?BaseDatabaseSchemaEditor._create_unique_sql.<locals>.<listcomp>Trü   r   )r’  r“  )rs   r   r	  r�  r  r”  )r:   r=   rË  Úsupports_partial_indexesr�  rÓ   r   rŸ  r"   r~   r  r]   Úsql_create_unique_indexÚsql_create_uniquer¡  r   rY   r   r	   rŽ  rÉ  r�  )r@   r'   rŒ   r   r�  r  r”  r“  r•  r¢  rs   r	  rK   r   r   r   rv     sT   þýûûúúøøÿ
ÿ

ùz+BaseDatabaseSchemaEditor._create_unique_sqlc                    s&   |r	‡ fdd„}nˆ j }t||d|ƒS )Nc                     r¿  r*   rÀ  rš  rE   r   r   Úcreate_unique_nameL  rÂ  zLBaseDatabaseSchemaEditor._unique_constraint_name.<locals>.create_unique_nameÚ_uniq)rW  r   )r@   rs   r	  rý   rÒ  r   rE   r   r  I  s   z0BaseDatabaseSchemaEditor._unique_constraint_namec           	      C   sh   |r| j jjr|r| j jjr|r| j jjr|r| j jjsd S |s&|s&|s&|r*| j}n| j}|  |||¡S r*   )	r:   r=   rË  rÏ  r�  rÓ   rò   ré   r  )	r@   r'   r   r�  r  r”  r“  r•  rK   r   r   r   rG  T  s*   þýûûúúøøz+BaseDatabaseSchemaEditor._delete_unique_sqlc                 C   s    | j |  |¡| jd|i dœ S )Nrf   rÊ  )rÍ  r]   rz   )r@   r   rf   r   r   r   Ú
_check_sqlp  s   þz#BaseDatabaseSchemaEditor._check_sqlc                 C   s$   t | jt|jj| jƒ|  |¡|d�S )N)rs   r   rf   )r   Úsql_create_checkr	   r"   r~   r]   )r@   r'   r   rf   r   r   r   rX  v  s   üz*BaseDatabaseSchemaEditor._create_check_sqlc                 C   rÃ  r*   )r  Úsql_delete_checkrÅ  r   r   r   rK  ~  rÆ  z*BaseDatabaseSchemaEditor._delete_check_sqlc                 C   s    t |t|jj| jƒ|  |¡d�S r£  )r   r	   r"   r~   r]   )r@   Útemplater'   r   r   r   r   r  �  s
   ýz/BaseDatabaseSchemaEditor._delete_constraint_sqlc
                    s  |dur‡ fdd„|D ƒ}ˆ j  ¡ �}
ˆ j j |
|jj¡}W d  ƒ n1 s'w   Y  g }| ¡ D ]Y\}}|du s@||d kr‹|durK|d |krKq2|durV|d |krVq2|dura|d |kraq2|durl|d |krlq2|duru|d	 suq2|dur€|d
 |kr€q2|	r†||	vr‹| |¡ q2|S )z@Return all constraint names matching the columns and conditions.Nc                    s   g | ]	}ˆ j j |¡‘qS r   )r:   ÚintrospectionÚidentifier_converter)r-   r   rE   r   r   rc   –  s    ÿÿz>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>r	  r¢   r   rÖ   rf   r/  r«   )r:   rZ   rØ  Úget_constraintsr"   r~   ÚitemsrV   )r@   r'   r‡  r¢   r   rÖ   r/  rf   r?  rû   rZ   r†   Úresultr   Úinfodictr   rE   r   r   ˆ  s8   
þÿÿ
€z*BaseDatabaseSchemaEditor._constraint_namesc                 C   sV   | j |dd�}|rt|ƒdkrtdt|ƒ|jjf ƒ‚|D ]}|  |  ||¡¡ qd S )NTr¸  rþ   z0Found wrong number (%s) of PK constraints for %s)r   r  r  r"   r~   rF   Ú_delete_primary_key_sql)r@   r'   r9  r
  rZ  r   r   r   rT  ±  s   þÿÿÿz,BaseDatabaseSchemaEditor._delete_primary_keyc              
   C   sJ   t | jt|jj| jƒ|  | j|jj|jgdd�¡t|jj|jg| jƒd�S )NÚ_pkrC  )rs   r   r	  )	r   Úsql_create_pkr	   r"   r~   r]   rW  r€   r   r·  r   r   r   rV  ¾  s   ÿÿøz0BaseDatabaseSchemaEditor._create_primary_key_sqlc                 C   rÃ  r*   )r  Úsql_delete_pkrÅ  r   r   r   rÞ  Ê  rÆ  z0BaseDatabaseSchemaEditor._delete_primary_key_sqlc                 C   s   d|   |¡ S )NzCOLLATE )r]   )r@   r’   r   r   r   r—   Í  r^   z%BaseDatabaseSchemaEditor._collate_sqlc                 C   s*   | j |  |¡d |¡dœ }|  |¡ d S )Nú,)Ú	procedureÚparam_types)Úsql_delete_procedurer]   rˆ   rF   )r@   Úprocedure_namerä  rK   r   r   r   Úremove_procedureÐ  s
   þz)BaseDatabaseSchemaEditor.remove_procedure)FT)r   )F)rO   r*   )NNNNN)NNNNNN)T)NNNNNNNN)mÚ__name__Ú
__module__Ú__qualname__Ú__doc__r‡   r  r  rÌ   r$  r&  rz  ru  rv  ry  rx  rw  r{  r1  r¼  rS  rÌ  rz   Úsql_delete_constraintrÍ  rÕ  rÖ  rÑ  ré   r¾  r�   r!  rÄ  r   rÐ  r¦  rò   rà  rá  rå  rA   rD   rG   rF   r]   r‘   rª   rx   r™   rš   rž   rœ   ÚstaticmethodrÄ   r›   rY   rÊ   rË   r×   rÙ   rÞ   rà   rá   rî   rö   rè   r  r  r-  r5  r>  r8  rP  r%  rO  rN  r7  rW  rŒ  rŽ  r�  ró   rJ  rÛ   r¡  rÆ   r'  r6  r¬  rF  rU  rL  rƒ   r"  r0  rÉ  rÎ  rv   r  rG  rÔ  rX  rK  r  r   rT  rV  rÞ  r—   rç  r   r   r   r   r9   K   s0   ÿÿÿÿÿÿÿ
	
	Q
7	
	
"H
 I
÷  [
&
 
 ò
6	
÷,
÷
5
ø

ö
)r9   )Úloggingr$   r   Údjango.confr   Ú!django.db.backends.ddl_referencesr   r   r   r   r   r	   Údjango.db.backends.utilsr
   r   Údjango.db.modelsr   r   Údjango.db.models.sqlr   Údjango.db.transactionr   r   Údjango.utilsr   Ú	getLoggerrR   r   r(   r4   r9   r   r   r   r   Ú<module>   s     
