Как получить имена всех атрибутов/списка столбцов с помощью базы данных 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 и обнаружил несколько вещей. Я пытался сделать то же самое, но я обнаружил, что лучшие шаги следующие:

  1. Выбрать из всех_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.