o 3a5@szddlmZddlZddlmZddlmZmZm Z ddl m Z ddl m Z edejdZed d ZGd d d eZdS) ) namedtupleN) FIELD_TYPE)BaseDatabaseIntrospection FieldInfo TableInfo)Index) OrderedSetr)extra is_unsignedhas_json_constraintInfoLinezXcol_name data_type max_len num_prec num_scale extra column_default collation is_unsignedc seZdZiejdejdejdejdejdej dej dej dej dej dejdejd ejd ejdejd ejdejdejdejdejdejdiZfd d ZddZddZdddZddZddZddZ ddZ!ddZ"Z#S) DatabaseIntrospection TextField CharField DecimalField DateField DateTimeField FloatField IntegerField JSONFieldBigIntegerFieldSmallIntegerField TimeFieldcstt||}d|jvr|dkrdS|dkrdS|dkrdS|jr3|dkr'dS|dkr-d S|dkr3d S|jr8d S|S) Nauto_incrementr AutoFieldr BigAutoFieldrSmallAutoFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerFieldr)superget_field_typer r r )self data_type description field_type __class__H/usr/lib/python3/dist-packages/django/db/backends/mysql/introspection.pyr!-s$ z$DatabaseIntrospection.get_field_typecCs|ddd|DS)z>Return a list of table and view names in the current database.zSHOW FULL TABLEScSs*g|]}t|dddd|dqS)rtv)z BASE TABLEVIEW)rget.0rowr(r(r) Fs"z8DatabaseIntrospection.get_table_list..)executefetchall)r"cursorr(r(r)get_table_listCs z$DatabaseIntrospection.get_table_listc Cs<i}|jjr|jjjr|d|gdd|D}|d|g|}|r,|dnd}|d||gdd |D}|d |jj|d d }g}|j D]G} || d} | t g| d d|| j pn| d|| j pw| d|| jp| d| d| j| j| j| j| d|vRqT|S)zj Return a description of the table with the DB-API cursor.description interface." aZ SELECT c.constraint_name AS column_name FROM information_schema.check_constraints AS c WHERE c.table_name = %s AND LOWER(c.check_clause) = 'json_valid(`' + LOWER(c.constraint_name) + '`)' AND c.constraint_schema = DATABASE() cSsh|]}|dqSrr(r/r(r(r) Zsz>DatabaseIntrospection.get_table_description..z SELECT table_collation FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = %s ra@ SELECT column_name, data_type, character_maximum_length, numeric_precision, numeric_scale, extra, column_default, CASE WHEN collation_name = %s THEN NULL ELSE collation_name END AS collation_name, CASE WHEN column_type LIKE '%% unsigned' THEN 1 ELSE 0 END AS is_unsigned FROM information_schema.columns WHERE table_name = %s AND table_schema = DATABASE() cSsi|] }|dt|qSr7)r )r0liner(r(r) xsz?DatabaseIntrospection.get_table_description..zSELECT * FROM %s LIMIT 1cSs|durt|S|SN)int)ir(r(r)to_int|sz;DatabaseIntrospection.get_table_description..to_intN) connectionmysql_is_mariadbfeaturescan_introspect_json_fieldr3r4fetchoneops quote_namer$appendrmax_lennum_prec num_scalecolumn_default collationr r ) r"r5 table_namejson_constraintsr1default_column_collation field_infor?fieldsr:infor(r(r)get_table_descriptionIsT      z+DatabaseIntrospection.get_table_descriptionr(cCs2|||D]}d|jvr||jdgSqgS)Nr)tablecolumn)rWr name)r"r5rQ table_fieldsrTr(r(r) get_sequencess  z#DatabaseIntrospection.get_sequencescCs0|||}i}|D] \}}}||f||<q |S)z Return a dictionary of {field_name: (field_name_other_table, other_table)} representing all relationships to the given table. )get_key_columns)r"r5rQ constraints relations my_fieldname other_table other_fieldr(r(r) get_relationss z#DatabaseIntrospection.get_relationscCs$g}|d|g|||S)z Return a list of (column_name, referenced_table_name, referenced_column_name) for all key columns in the given table. a@ SELECT column_name, referenced_table_name, referenced_column_name FROM information_schema.key_column_usage WHERE table_name = %s AND table_schema = DATABASE() AND referenced_table_name IS NOT NULL AND referenced_column_name IS NOT NULL)r3extendr4)r"r5rQ key_columnsr(r(r)r]s z%DatabaseIntrospection.get_key_columnscCs,|d|g|}|s|jjjS|dS)z Retrieve the storage engine for a given table. Return the default storage engine if the table doesn't exist. zBSELECT engine FROM information_schema.tables WHERE table_name = %sr)r3rHrDrF_mysql_storage_engine)r"r5rQresultr(r(r)get_storage_engines z(DatabaseIntrospection.get_storage_enginecCs~t}t|d}dd|D}|D]'}|jtjjkr<|jj |j |j kr<|j dd|vr<| |j ddq|S)Nrcss|]}|js|VqdSr<) is_whitespace)r0tokenr(r(r) szBDatabaseIntrospection._parse_constraint_columns..r-) rsqlparseparseflattenttypetokensNamerDrIrJvalueadd)r" check_clausecolumns check_columns statementrqrjr(r(r)_parse_constraint_columnssz/DatabaseIntrospection._parse_constraint_columnscCsxi}d}|||g|D]0\}}}}||vr6tdddd|r%||fndd||<|jjjr6g||d<||d|qd} || |g|D]#\}} | dkrdd ||d <d ||d <qM| d krpd ||d <qM|jjjrd } d d| ||D} |jj rd} nd} || |g|D]$\}} | | | }t ||hkr| d7} d| }|dddd dd||<q|d|jj |dd|DD]X\}}}}}}}||vrtddddd||<|jjjrg||d<d ||d<|dkrtjn|||d<||d||jjjr)||d|dkr&dndq|D] }t|d|d<q.|S)zu Retrieve any constraints or keys (unique, pk, fk, check, index) across one or more columns. aX SELECT kc.`constraint_name`, kc.`column_name`, kc.`referenced_table_name`, kc.`referenced_column_name` FROM information_schema.key_column_usage AS kc WHERE kc.table_schema = DATABASE() AND kc.table_name = %s ORDER BY kc.`ordinal_position` FN)rv primary_keyuniqueindexcheck foreign_keyordersrvz SELECT c.constraint_name, c.constraint_type FROM information_schema.table_constraints AS c WHERE c.table_schema = DATABASE() AND c.table_name = %s z primary keyTrzr{rcSsh|]}|jqSr()rZ)r0rVr(r(r)r8sz8DatabaseIntrospection.get_constraints..a SELECT c.constraint_name, c.check_clause FROM information_schema.check_constraints AS c WHERE c.constraint_schema = DATABASE() AND c.table_name = %s a3 SELECT cc.constraint_name, cc.check_clause FROM information_schema.check_constraints AS cc, information_schema.table_constraints AS tc WHERE cc.constraint_schema = DATABASE() AND tc.table_schema = cc.constraint_schema AND cc.constraint_name = tc.constraint_name AND tc.constraint_type = 'CHECK' AND tc.table_name = %s r-z__unnamed_constraint_%s__zSHOW INDEX FROM %scSs"g|] }|dd|dfqS)NrC r()r0xr(r(r)r2&sz9DatabaseIntrospection.get_constraints..)rvrzr{r}r~r|BTREEtypeDDESCASC)r3r4rrDrFsupports_index_column_orderingrtlower can_introspect_check_constraintsrWrErysetrIrJrsuffixrKvalueslist)r"r5rQr^ name_query constraintrY ref_table ref_column type_querykindunnamed_constraints_indexrvruconstraint_columnsrX non_uniquer|colseqordertype_r(r(r)get_constraintss                   z%DatabaseIntrospection.get_constraints)r()$__name__ __module__ __qualname__rBLOBCHARDECIMAL NEWDECIMALDATEDATETIMEDOUBLEFLOATINT24JSONLONGLONGLONGSHORTSTRINGTIME TIMESTAMPTINY TINY_BLOB MEDIUM_BLOB LONG_BLOB VAR_STRINGdata_types_reverser!r6rWr\rcr]rhryr __classcell__r(r(r&r)r sd       G  r ) collectionsrrmMySQLdb.constantsr%django.db.backends.base.introspectionrr BaseFieldInfordjango.db.modelsrdjango.utils.datastructuresr_fieldsr r r(r(r(r)s