Подтвердить что ты не робот

Список таблиц базы данных с SQLAlchemy

Я хочу реализовать функцию, которая предоставляет информацию обо всех таблицах (и их именах столбцов), которые присутствуют в базе данных (а не только те, которые созданы с помощью SQLAlchemy). Читая документацию, мне кажется, что это делается через отражение, но мне не удалось что-то сделать. Любые предложения или примеры того, как это сделать?

4b9b3361

Ответ 1

начать с движка:

from sqlalchemy import create_engine
engine = create_engine("postgresql://u:[email protected]/database")

быстрый путь ко всем именам таблиц/столбцов, используйте инспектор:

from sqlalchemy import inspect
inspector = inspect(engine)

for table_name in inspector.get_table_names():
   for column in inspector.get_columns(table_name):
       print("Column: %s" % column['name'])

docs: http://docs.sqlalchemy.org/en/rel_0_9/core/reflection.html?highlight=inspector#fine-grained-reflection-with-inspector

используйте MetaData/Tables:

from sqlalchemy import MetaData
m = MetaData()
m.reflect(engine)
for table in m.tables.values():
    print(table.name)
    for column in table.c:
        print(column.name)

docs: http://docs.sqlalchemy.org/en/rel_0_9/core/reflection.html#reflecting-all-tables-at-once

Ответ 2

Привет, я создал небольшой модуль, который помогает легко отражать все таблицы в базе данных, с которой вы подключаетесь с SQLAlchemy, дайте ей посмотреть: EZAlchemy

from EZAlchemy.ezalchemy import EZAlchemy

DB = EZAlchemy(
    db_user='username',
    db_password='pezzword',
    db_hostname='127.0.0.1',
    db_database='mydatabase',
    d_n_d='mysql'   # stands for dialect+driver
)

# this function loads all tables in the database to the class instance DB
DB.connect()

# List all associations to DB, you will see all the tables in that database
dir(DB)

Ответ 3

Хотя размышление/проверка полезны, у меня были проблемы с получением данных из базы данных. Я обнаружил, что sqlsoup намного удобнее в использовании. Вы создаете движок с помощью sqlalchemy и передаете этот движок в sqlsoup.SQlSoup. то есть:

import sqlsoup

def create_engine():
    from sqlalchemy import create_engine
    return create_engine(f"mysql+mysqlconnector://{database_username}:{database_pw}@{database_host}/{database_name}")

def test_sqlsoup():
    engine = create_engine()
    db = sqlsoup.SQLSoup(engine)
    # Note: database must have a table called 'users' for this example
    users = db.users.all()
    print(users)

if __name__ == "__main__":
    test_sqlsoup()

Если вы знакомы с sqlalchemy, то вы знакомы с sqlsoup. Я использовал это для извлечения данных из базы данных WordPress.

Ответ 4

Сначала настройте движок sqlalchemy.

from sqlalchemy import create_engine, inspect, text
from sqlalchemy.engine import url

connect_url = url.URL(
    'oracle',
    username='db_username',
    password='db_password',
    host='db_host',
    port='db_port',
    query=dict(service_name='db_service_name'))

engine = create_engine(connect_url)

try:
    engine.connect()
except Exception as error:
    print(error)
    return

Как уже упоминалось, вы можете использовать метод inspect для получения имен таблиц.

Но в моем случае список таблиц, возвращаемых методом inspect, был неполным.

Итак, я нашел другой способ найти имена таблиц, используя чистые SQL-запросы в sqlalchemy.

query = text("SELECT table_name FROM all_tables where owner = '%s'"%str('db_username'))

table_name_data = self.session.execute(query).fetchall()

Просто для полноты ответа, здесь приведен код для извлечения имен таблиц методом inspect (если он хорошо работает в вашем случае).

inspector = inspect(engine)
table_names = inspector.get_table_names()