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

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

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


person sidewinder    schedule 24.06.2011    source источник


Ответы (12)


Все таблицы собраны в атрибуте tables объекта метаданных SQLAlchemy. Чтобы получить список имен этих таблиц:

>>> 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)
person SingleNegationElimination    schedule 24.06.2011
comment
Не рекомендуется с версии 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"). - person Java Xu; 21.03.2013
comment
@XuJiawan: Я не уверен, какая вещь здесь устарела, я не уверен, какой метод я предлагаю, если это не sqlalchemy.MetaData.reflect()? - person SingleNegationElimination; 21.05.2014
comment
@IfLoop: я нашел его в Документ sqlalchemy. - person Java Xu; 22.05.2014
comment
@XuJiawan: ссылка предполагает, что reflect аргумент для MetaData.__init__, логический флаг, устарел в пользу использования MetaData.reflect(), как я показал в своем ответе. - person SingleNegationElimination; 22.05.2014
comment
@IfLoop: Очень сожалею о моем плохом английском. Ваш ответ совершенно правильный, и я его повысил. Я добавил этот комментарий, чтобы люди заметили, что если они используют версию ‹0.8, они не могут использовать метод MetaData.reflect() таким образом. А также прокомментируйте это для кого-то, у кого может быть такая же проблема, вызванная объявлением двигателя. - person Java Xu; 28.05.2014

В объекте engine есть метод для получения списка имен таблиц. engine.table_names()

person Zubair Alam    schedule 31.05.2015
comment
я получаю 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' (стек усечен) - person Darshan Chaudhary; 26.07.2017
comment
Это также работает с Flask-SQLAlchemy, поскольку существует прямой доступ к движку, например, DB.engine.table_names() или другое имя переменной базы данных. - person colidyre; 23.03.2020

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

$ python
>>> from myapp import db
>>> db.engine.table_names()
person Mwirabua Tim    schedule 12.12.2018
comment
Примечание: это не работает для SQLAlchemy 2.0. - person James Mishra; 10.04.2021

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

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')
person jmunsch    schedule 21.09.2016
comment
Это не кроссплатформенный. Он будет работать только с mysql, он не будет работать с другими механизмами баз данных. - person Edward Betts; 29.03.2017
comment
@EdwardBetts, вы правы, какой движок db вас интересовал? - person jmunsch; 29.03.2017
comment
OP запросил postgres, а не sql - person o elhajoui; 05.11.2019

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

metadata.tables.keys()
person Keith    schedule 24.06.2011

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

person user2189731    schedule 10.05.2017
comment
это! без reflect metadata.sorted_tables не будет работать - person Kay; 19.03.2020

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

engine.table_names()

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

engine.has_table(table_name)
person Han Zhang    schedule 12.05.2020

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

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

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

person zerocog    schedule 23.11.2016

  • Чтобы получить список всех существующих таблиц в БД:

Начиная с SQLAlchemy 1.4: https://docs.sqlalchemy.org/en/14/core/reflection.html#fine-grained-reflection-with-inspector

from sqlalchemy import create_engine
from sqlalchemy import inspect
engine = create_engine('...')
insp = inspect(engine)
print(insp.get_table_names())

Старые методы (engine.table_names()) дают:

SADeprecationWarning: The from_engine() method on Inspector is deprecated and will be removed in a future release. Please use the sqlalchemy.inspect() function on an Engine or Connection in order to acquire an Inspector. (deprecated since: 1.4)

  • Чтобы получить список объявленных таблиц, используйте принятый ответ: metadata.tables.keys()
person Jean Monet    schedule 12.02.2021

Лучше всего использовать inspect:

  1. Создайте инспектор и подключите его к движку
  2. Соберите имена таблиц в базе данных
  3. Собирать имена столбцов таблицы
from sqlalchemy import create_engine, inspect

engine = create_engine("sqlite:///../Resources/dow.sqlite")
conn = engine.connect()
inspector = inspect(conn)
inspector.get_table_names() #returns "dow"

columns = inspector.get_columns('dow')

for column in columns:
    print(column["name"], column["type"])
person RyanAbnavi    schedule 14.01.2021

Полный пример отображения всей информации столбца. Предполагается, что переменная df содержит фрейм данных для записи в базу данных SQL.

from sqlalchemy import create_engine, inspect
from sqlalchemy_utils.functions import database_exists, create_database

engine = create_engine('sqlite:///mydb.sqlite', echo=True)

if not database_exists(engine.url):
    create_database(engine.url)
else:
    engine.connect()

df.to_sql('MyTable', con=engine, if_exists='replace', index=False) # index=False avoids auto-creation of level_0 (name tiebreaker)

inspector = inspect(engine)
table_names = inspector.get_table_names()
for table_name in table_names:
    print(f"Table:{table_name}")
    column_items = inspector.get_columns(table_name)
    print('\t'.join(n for n in column_items[0]))
    for c in column_items:
        assert len(c) == len(column_items[0])
        print('\t'.join(str(c[n]) for n in c))
person BSalita    schedule 03.04.2021

person    schedule
comment
Это правильный ответ, который работает по состоянию на ноябрь 2018 года. - person Austin Mackillop; 12.11.2018
comment
Если это не сработает, то это, скорее всего, связано с тем, что движок не может правильно подключиться (проблема в строке 2), но вы не получите сообщение об ошибке, пока не запустите engine.table_names() - person grofte; 16.01.2019
comment
Воспользуйтесь этим ответом, люди. - person Umar.H; 01.07.2019