SQLAlchemy - Отримання списку таблиць


94

Я не міг знайти жодної інформації про це в документації, але як я можу отримати список таблиць, створених у SQLAlchemy?

Я використовував метод класу для створення таблиць.

Відповіді:


86

Усі таблиці зібрані в tablesатрибуті об'єкта SQLAlchemy MetaData. Щоб отримати список назв цих таблиць:

>>> metadata.tables.keys()
['posts', 'comments', 'users']

Якщо ви використовуєте декларативне розширення, то, ймовірно, ви самі не керуєте метаданими. На щастя, метадані все ще присутні в базовому класі,

>>> Base = sqlalchemy.ext.declarative.declarative_base()
>>> Base.metadata
MetaData(None)

Якщо ви намагаєтеся з’ясувати, які таблиці є у вашій базі даних, навіть серед тих, про які ви ще навіть не розповідали SQLAlchemy, тоді ви можете використовувати відображення таблиць. Потім SQLAlchemy перевірить базу даних та оновить метадані з усіма відсутніми таблицями.

>>> metadata.reflect(engine)

Для Postgres, якщо у вас декілька схем, вам потрібно буде пройти цикл по всіх схемах в двигуні:

from sqlalchemy import inspect
inspector = inspect(engine)
schemas = inspector.get_schema_names()

for schema in schemas:
    print("schema: %s" % schema)
    for table_name in inspector.get_table_names(schema=schema):
        for column in inspector.get_columns(table_name, schema=schema):
            print("Column: %s" % column)

7
Не застосовується з версії 0.8: Будь ласка, використовуйте метод sqlalchemy.schema.MetaData.reflect (). І зауважте, engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')скоріше використовуйте , ніж "mysql://user:password@host"та engine.execute("use db_name").
Java Xu

@XuJiawan: Я не впевнений, яка річ тут застаріла, я не впевнений, який метод я пропоную, якщо це не так sqlalchemy.MetaData.reflect()?
SingleNegationElimination

@IfLoop: Я знайшов його з документа sqlalchemy .
Java Xu

1
@XuJiawan: Посилання припускає, що reflect аргумент до MetaData.__init__, логічний прапор, застарілий на користь використання MetaData.reflect(), точно так, як я показав у своїй відповіді.
SingleNegationElimination

2
@IfLoop: Дуже вибачте за мою погану англійську мову. Ваша відповідь точно правильна, і я підтримав її. Я додав цей коментар лише для того, щоб люди помітили, що якщо вони використовують версію <0.8, вони можуть не використовувати MetaData.reflect()метод таким чином. А також прокоментуйте це для когось іншого, хто може мати таку ж проблему, спричинену декларацією двигуна.
Java Xu

78

У engineоб'єкті є метод для отримання списку імен таблиць.engine.table_names()


я отримую Traceback (most recent call last): File "dedup_jobs.py", line 31, in <module> print(engine.table_names()) File "/Users/darshanchoudhary/.virtualenvs/services/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2128, in table_names return self.dialect.get_table_names(conn, schema) value = value.replace(self.escape_quote, self.escape_to_quote) AttributeError: 'NoneType' object has no attribute 'replace'(стек усічений)
Даршан Чаудхарі

Це також працює з Flask-SQLAlchemy , оскільки існує прямий доступ до механізму через, наприклад, DB.engine.table_names()або інше ім'я змінної бази даних.
colidyre

42
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())

3
Це правильна відповідь, яка працює станом на листопад 2018 р.
Остін Макіллоп,

Якщо це не спрацьовує, то це, швидше за все, тому що двигун не може правильно підключитися (отже, проблема в рядку 2), але ви не отримаєте повідомлення про помилку, поки не запуститеengine.table_names()
grofte

Використовуйте цю відповідь люди.
Манакін

12

У інтерпретаторі python використовуйте db.engine.table_names ()

$ python
>>> from myapp import db
>>> db.engine.table_names()

11

Я шукав щось подібне:

from sqlalchemy import create_engine
eng = create_engine('mysql+pymysql://root:password@localhost:3306', pool_recycle=3600)
q = eng.execute('SHOW TABLES')

available_tables = q.fetchall()

Він виконує і повертає всі таблиці.

оновлення:

Postgres:

eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')

3
Це не крос-платформа. Він буде працювати лише з mysql, він не буде працювати з іншими механізмами баз даних.
Едвард Беттс,

@EdwardBetts ти маєш рацію, про який двигун дб ти дивувався?
jmunsch

OP попросив postgres не sql
o elhajoui

4

Об'єкт метаданих, за допомогою якого ви створили таблиці, містить його у словнику.

metadata.tables.keys()

4

Я вирішую ту ж проблему і знайшов цю публікацію. Після деякої спроби запустити, я б запропонував використовувати нижче, щоб перерахувати всі таблиці: (згадується zerocog)

metadata = MetaData()
metadata.reflect(bind=engine)
for table in metadata.sorted_tables:
    print(table)

Це корисно для безпосереднього поводження зі столом, і я вважаю, що це рекомендується.

І використовуйте код нижче, щоб отримати імена таблиць:

for table_name in engine.table_names():
    print(table_name)

"metadata.tables" надає Dict для імені таблиці та об'єкта Table. що також було б корисно для швидкого запиту.


це! без reflect, metadata.sorted_tablesне буде працювати
Кей,


2

Просто це просто:

engine.table_names()

Також, щоб перевірити, чи існує таблиця:

engine.has_table(table_name)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.