найдите, какие столбцы в таблице postgis имеют тип geometry и какие атрибуты

#python #postgresql #geometry #postgis

#питон #postgresql #геометрия #postgis

Вопрос:

Мне нужно найти все столбцы, в которых содержатся значения геометрии в таблице postgres, я пытаюсь заставить ее работать так. Но я не совсем уверен, что это будет работать все время.

 list_geometry_columns = pd.read_sql_query(f"""select column_name from information_schema.columns where table_schema = '{schema_name}' and table_name = '{tbl_name}' and data_type='USER-DEFINED'""",con=engine)['column_name'].tolist() list_attrib_columns = pd.read_sql_query(f"""select column_name from information_schema.columns where table_schema = '{schema_name}' and table_name = '{tbl_name}' and data_type!='USER-DEFINED'""",con=engine)['column_name'].tolist()  

В моей текущей реализации «ОПРЕДЕЛЯЕМЫЙ ПОЛЬЗОВАТЕЛЕМ» может присутствовать и для других столбцов.

Ответ №1:

Вы можете запросить geometry_column представление (или geography_column ), чтобы получить геометрию

 SELECT * FROM geometry_columns WHERE f_table_schema = 'myschema' AND f_table_name = 'myTable';  

Кроме того, вы можете получить список всех типов столбцов/типов форматов и отфильтровать геометрию:

 SELECT  pg_attribute.attname AS column_name,  pg_type.typname AS data_type,  pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS format_type FROM  pg_catalog.pg_attribute JOIN pg_catalog.pg_type  ON pg_attribute.atttypid = pg_type.oid INNER JOIN  pg_catalog.pg_class ON pg_class.oid = pg_attribute.attrelid INNER JOIN  pg_catalog.pg_namespace ON pg_namespace.oid = pg_class.relnamespace WHERE  pg_attribute.attnum gt; 0  AND NOT pg_attribute.attisdropped  --AND pg_type.typname = 'geometry'  AND pg_namespace.nspname = 'public'  AND pg_class.relname = 'my_table' ORDER BY  attnum ASC;  

Комментарии:

1. спасибо @JGH, но мое представление кажется пустым, поэтому я не получаю ни одного имени столбца.

2. @бхавеш, это странно… смотрите Мое редактирование с другим способом получения информации, опираясь на pg_catalog