2014-01-23 5 views
27

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

ответ

55

старт с двигателем:

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']) 

документы: http://docs.sqlalchemy.org/en/rel_0_9/core/reflection.html?highlight=inspector#fine-grained-reflection-with-inspector

в качестве альтернативы, использование МЕТАДАННЫЕ/Столы:

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

Есть ли польза (или падения), чтобы с помощью '' inspect' против reflect'? – dthor

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) 
Смежные вопросы