#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