o 3ai(@s4ddlmZmZmZddlmZGdddeZdS))BaseDatabaseIntrospection FieldInfo TableInfo)IndexcseZdZiddddddddd d d d d ddddddddddddddddddddddd d!d"Zd#ZgZfd$d%Zd&d'Zd(d)Zd3d+d,Z d-d.Z d/d0Z d1d2Z Z S)4DatabaseIntrospection BooleanField BinaryFieldBigIntegerFieldSmallIntegerField IntegerField TextFieldi FloatFieldiieGenericIPAddressFieldi CharFieldii: DateFieldi; TimeFieldiZ DateTimeFieldii DurationFieldi DecimalField UUIDField JSONField)ii ibtreecsFt||}|jr!d|jvr!|dkrdS|dkrdS|dkr!dS|S)Nnextvalr AutoFieldr BigAutoFieldrSmallAutoField)superget_field_typedefault)self data_type description field_type __class__M/usr/lib/python3/dist-packages/django/db/backends/postgresql/introspection.pyr#$sz$DatabaseIntrospection.get_field_typecs4|djjjr dndfdd|DS)z>Return a list of table and view names in the current database.a SELECT c.relname, CASE WHEN {} THEN 'p' WHEN c.relkind IN ('m', 'v') THEN 'v' ELSE 't' END FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN ('f', 'm', 'p', 'r', 'v') AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND pg_catalog.pg_table_is_visible(c.oid) zc.relispartitionFALSEcs"g|] }|djvrt|qS)r)ignored_tablesr.0rowr%r+r, :"z8DatabaseIntrospection.get_table_list..)executeformat connectionfeaturessupports_table_partitionsfetchall)r%cursorr+r2r,get_table_list/s z$DatabaseIntrospection.get_table_listcsL|d|gdd|D|d|jj|fdd|jDS)zi Return a description of the table with the DB-API cursor.description interface. ag SELECT a.attname AS column_name, NOT (a.attnotnull OR (t.typtype = 'd' AND t.typnotnull)) AS is_nullable, pg_get_expr(ad.adbin, ad.adrelid) AS column_default, CASE WHEN collname = 'default' THEN NULL ELSE collname END AS collation FROM pg_attribute a LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum LEFT JOIN pg_collation co ON a.attcollation = co.oid JOIN pg_type t ON a.atttypid = t.oid JOIN pg_class c ON a.attrelid = c.oid JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.relkind IN ('f', 'm', 'p', 'r', 'v') AND c.relname = %s AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND pg_catalog.pg_table_is_visible(c.oid) cSsi|] }|d|ddqS)rNr+r0liner+r+r, Usz?DatabaseIntrospection.get_table_description..zSELECT * FROM %s LIMIT 1c s8g|]}t|j|j|j|j|j|jg|jRqSr+)rname type_code display_size internal_size precisionscaler> field_mapr+r,r3Ws z?DatabaseIntrospection.get_table_description..)r5r:r7ops quote_namer'r%r; table_namer+rGr,get_table_description<s  z+DatabaseIntrospection.get_table_descriptionr+cs$|dgfdd|DS)Na SELECT s.relname as sequence_name, col.attname FROM pg_class s JOIN pg_namespace sn ON sn.oid = s.relnamespace JOIN pg_depend d ON d.refobjid = s.oid AND d.refclassid = 'pg_class'::regclass JOIN pg_attrdef ad ON ad.oid = d.objid AND d.classid = 'pg_attrdef'::regclass JOIN pg_attribute col ON col.attrelid = ad.adrelid AND col.attnum = ad.adnum JOIN pg_class tbl ON tbl.oid = ad.adrelid WHERE s.relkind = 'S' AND d.deptype in ('a', 'n') AND pg_catalog.pg_table_is_visible(tbl.oid) AND tbl.relname = %s cs g|] }|d|ddqS)rr=)rAtablecolumnr+r/rLr+r,r3rsz7DatabaseIntrospection.get_sequences..r5r:)r%r;rL table_fieldsr+rPr, get_sequencesds   z#DatabaseIntrospection.get_sequencescCsdd|||DS)z Return a dictionary of {field_name: (field_name_other_table, other_table)} representing all relationships to the given table. cSs"i|] }|d|d|dfqS)rr=r+r/r+r+r,r@|r4z7DatabaseIntrospection.get_relations..)get_key_columnsrKr+r+r, get_relationswsz#DatabaseIntrospection.get_relationscCs|d|g|S)Na[ SELECT a1.attname, c2.relname, a2.attname FROM pg_constraint con LEFT JOIN pg_class c1 ON con.conrelid = c1.oid LEFT JOIN pg_class c2 ON con.confrelid = c2.oid LEFT JOIN pg_attribute a1 ON c1.oid = a1.attrelid AND a1.attnum = con.conkey[1] LEFT JOIN pg_attribute a2 ON c2.oid = a2.attrelid AND a2.attnum = con.confkey[1] WHERE c1.relname = %s AND con.contype = 'f' AND c1.relnamespace = c2.relnamespace AND pg_catalog.pg_table_is_visible(c1.oid) rQrKr+r+r,rU~s  z%DatabaseIntrospection.get_key_columnsc Csi}|d|g|D]&\}}}}}||dk|dv|dkr't|ddnd|dkd d|d ||<q |d |j|g|D]?\} }} } } } }}| |vr| |jko]| d  o]|du}|dgkre|ng| dgkrm| ng| | dd d |rxtjn| ||d || <qA|S)z Retrieve any constraints or keys (unique, pk, fk, check, index) across one or more columns. Also retrieve the definition of expression-based indexes. aH SELECT c.conname, array( SELECT attname FROM unnest(c.conkey) WITH ORDINALITY cols(colid, arridx) JOIN pg_attribute AS ca ON cols.colid = ca.attnum WHERE ca.attrelid = c.conrelid ORDER BY cols.arridx ), c.contype, (SELECT fkc.relname || '.' || fka.attname FROM pg_attribute AS fka JOIN pg_class AS fkc ON fka.attrelid = fkc.oid WHERE fka.attrelid = c.confrelid AND fka.attnum = c.confkey[1]), cl.reloptions FROM pg_constraint AS c JOIN pg_class AS cl ON c.conrelid = cl.oid WHERE cl.relname = %s AND pg_catalog.pg_table_is_visible(cl.oid) p)rWuf.r=NcF)columns primary_keyunique foreign_keycheckindex definitionoptionsa SELECT indexname, array_agg(attname ORDER BY arridx), indisunique, indisprimary, array_agg(ordering ORDER BY arridx), amname, exprdef, s2.attoptions FROM ( SELECT c2.relname as indexname, idx.*, attr.attname, am.amname, CASE WHEN idx.indexprs IS NOT NULL THEN pg_get_indexdef(idx.indexrelid) END AS exprdef, CASE am.amname WHEN %s THEN CASE (option & 1) WHEN 1 THEN 'DESC' ELSE 'ASC' END END as ordering, c2.reloptions as attoptions FROM ( SELECT * FROM pg_index i, unnest(i.indkey, i.indoption) WITH ORDINALITY koi(key, option, arridx) ) idx LEFT JOIN pg_class c ON idx.indrelid = c.oid LEFT JOIN pg_class c2 ON idx.indexrelid = c2.oid LEFT JOIN pg_am am ON c2.relam = am.oid LEFT JOIN pg_attribute attr ON attr.attrelid = c.oid AND attr.attnum = idx.key WHERE c.relname = %s AND pg_catalog.pg_table_is_visible(c.oid) ) s2 GROUP BY indexname, indisunique, indisprimary, amname, exprdef, attoptions; _btreeT) r\ordersr]r^r_r`ratyperbrc)r5r:tuplesplitindex_default_access_methodendswithrsuffix)r%r;rL constraints constraintr\kind used_colsrcrar^primaryretype_rb basic_indexr+r+r,get_constraintssJ       z%DatabaseIntrospection.get_constraints)r+)__name__ __module__ __qualname__data_types_reverserir.r#r<rMrSrVrUrs __classcell__r+r+r)r,rsb        (rN)%django.db.backends.base.introspectionrrrdjango.db.modelsrrr+r+r+r,s