SQLAlchemy - Получение списка таблиц


99

Я не смог найти никакой информации об этом в документации, но как мне получить список таблиц, созданных в SQLAlchemy?

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

Ответы:


90

Все таблицы собраны в 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)

8
Не рекомендуется, начиная с версии 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

82

В 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

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

3
Это правильный ответ, который работает по состоянию на ноябрь 2018 года.
Остин Маккиллоп,

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

Воспользуйтесь этим ответом, люди.
Manakin

Большой! просто и так хорошо работает
Soubinan

13

В интерпретаторе python используйте db.engine.table_names ()

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

10

Я искал что-то вроде этого:

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, вы правы, какой движок db вас интересовал?
jmunsch

OP попросил postgres not sql
o elhajoui 05

5

Объект метаданных, с помощью которого вы создали таблицы, имеет его в словаре.

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

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

meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
    print table

Ссылка http://docs.sqlalchemy.org/en/latest/core/reflection.html


2

Вот так просто:

engine.table_names()

Также, чтобы проверить, существует ли таблица:

engine.has_table(table_name)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.