Как получить имена всех атрибутов/списка столбцов с помощью базы данных Python и Postgres/Oracle
При работе с динамическими таблицами в каком-либо проекте вы, скорее всего, никогда не узнаете, с какой таблицей будет взаимодействовать пользователь, но вы должны сделать проект таким, чтобы пользователь мог выполнять CRUD-операции в любой существующей или новой таблице. Так что справиться с этими ситуациями или, может быть, когда вам просто нужен список всех атрибутов случайной таблицы, становится сложно. В большинстве баз данных есть запрос для решения этой проблемы. Здесь я буду использовать Postgres и Python для реализации этого.
Для работы с Postgres вам понадобится psycopg2. Чтобы установить это, используйте следующую команду в cmd.
pip install psycopg2
Кроме того, вам нужно будет установить pgAdmin и PostgreSQL в вашей системе.
Запрос:
Как всегда, нам понадобится базовая команда SQL, которую мы должны будем выполнить.
Самая основная команда будет
SELECT COLUMN_NAME from information_schema.columns WHERE table_schema = ‘your_schema_name’ AND table_name = ‘your_table_name’
В этом примере схема будет общедоступной, а имя таблицы будет demo_accounts.
Итак, запрос будет выглядеть так,
SELECT COLUMN_NAME from information_schema.columns WHERE table_schema = ‘public’ AND table_name = ‘demo_accounts'
и результат выполнения этого запроса в pgAdmin:
Теперь наша конечная цель — реализовать это с помощью Python, чтобы мы могли перебирать все заданные имена таблиц.
Код Python будет таким:
def get_column_names(connection,schema_name, table_name): """ Returns a list of column names for a given table. """ cur = connection.cursor() try: cur.execute("SELECT column_name FROM information_schema.columns WHERE table_schema = '%s' AND table_name = '%s';" % (schema_name, table_name)) rows = cur.fetchall() # print(cur.description) column_names = [row[0] for row in rows] cur.close() return column_names except (Exception, psycopg2.DatabaseError) as error: print(error)
Вывод будет таким:
Теперь это было только для имен столбцов, но практически эти данные или список данных, которые мы будем получать, не так уж полезны. поэтому вам нужно получить больше информации о самой таблице, например о типах данных столбцов, является ли это первичным ключом или нет и т. д. Для этого вам нужно использовать следующую команду вместо старой.
SELECT * from information_schema.columns WHERE table_schema = ‘public’ AND table_name = ‘demo_accounts'
Простое использование * вместо column_name в команде SQL даст вам гораздо больше данных, чем вы можете себе представить.
Например, если вы хотите получить из вывода только имя_столбца и тип_данных, вы можете просто использовать имя_столбца,тип_данных вместо *
Используя тот же метод get_column_names(), мы имеем:
def get_column_names(connection,schema_name, table_name): """ Returns a list of column names for a given table. """ cur = connection.cursor() try: cur.execute("SELECT column_name,data_type FROM information_schema.columns WHERE table_schema = '%s' AND table_name = '%s';" % (schema_name, table_name)) rows = cur.fetchall() print(rows) column_names = [row[0] for row in rows] cur.close() return column_names except (Exception, psycopg2.DatabaseError) as error: print(error)
Вот результат:
[('user_id', 'integer'), ('username ', 'text'), ('password ', 'text'), ('email ', 'text'), ('created_on ', 'time without time zone'), ('last_login ', 'time without time zone')]
Для выполнения полного кода вам понадобится существующая база данных и ее детали. Я свяжу свой репозиторий GitHub для этих файлов. Вы можете проверить файлы оттуда.
test.py будет основным скриптом, который будет более совершенным. Чтобы быстро взглянуть на код, не стесняйтесь проверить test1.py, test2.py.
#!/usr/bin/python # This is test1.py import psycopg2 def connect(): """ Connect to the PostgreSQL database server """ conn = psycopg2.connect(dbname="postgres", user="postgres", password="12345") return conn def get_column_names(connection,schema_name, table_name): """ Returns a list of column names for a given table. """ cur = connection.cursor() try: cur.execute("SELECT column_name FROM information_schema.columns WHERE table_schema = '%s' AND table_name = '%s';" % (schema_name, table_name)) rows = cur.fetchall() # print(cur.description) column_names = [row[0] for row in rows] cur.close() return column_names except (Exception, psycopg2.DatabaseError) as error: print(error) if __name__ == '__main__': connection = connect() schema_name = 'public' table_name = 'demo_accounts' schema_name = 'public' column_names = get_column_names(connection,schema_name, table_name) print(column_names)
[Новое добавлено 13 июня 2022 г.]
Недавно я работал с базой данных Oracle и обнаружил несколько вещей. Я пытался сделать то же самое, но я обнаружил, что лучшие шаги следующие:
- Выбрать из всех_tab_columns
select * from all_tab_columns;
2. Найдите нужную таблицу
После просмотра вывода и понимания формата таблицы найдите нужную таблицу.
3. Проверьте детали таблицы
В выходной таблице будет несколько столбцов, например: OWNER, TABLE_NAME, COLUMN_NAME, DATA_TYPE и т. д.
Поскольку вам нужны имена столбцов для определенной таблицы, обратите внимание на OWNER и TABLE_NAME.
4. Запустить запрос на основе этого
Теперь, когда у вас есть все детали, запустите свой запрос. Это будет выглядеть примерно так.
select * from all_tab_columns where owner='ABC' and table_name='MY_TABLE' order by column_id;
Заключение
Я знаю немного, но эта конкретная команда/метод очень полезна. Я сделал один проект, в котором у меня не было возможности узнать, с какой таблицей будет взаимодействовать пользователь, поэтому этот метод был очень полезен для меня. Используя это, вы можете получить основную информацию, необходимую для выполнения любых операций CRUD.
Я прикреплю сюда все файлы.
Ссылки на файлы:
Ссылки:
https://www.postgresqltutorial.com/postgresql-python/connect/
Спасибо, что дочитали до конца. Вы можете подписаться на меня здесь на Medium для получения дополнительных обновлений.
Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.