2011-06-24 2 views

ответ

52

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

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

Если вы используете декларативное расширение, то вы, вероятно, не управление метаданными самостоятельно. К счастью, метаданные по-прежнему присутствует на BaseClass,

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

Если вы пытаетесь выяснить, какие таблицы присутствуют в базе данных, даже среди тех, которые вы даже не сказали SQLAlchemy о еще, то вы можете использование таблица отражающий. sqlalchemy будет проверять базу данных и обновлять метаданные всеми отсутствующими таблицами.

>>> metadata.reflect(engine) 
+3

Устаревший с версии 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 «)'. –

+0

@XuJiawan: Я не уверен, какая вещь устарела здесь, я не уверен, какой метод им предлагает, если это не 'sqlalchemy.MetaData.reflect()'? – SingleNegationElimination

+0

@IfLoop: Я нашел его из [документа sqlalchemy] (http://docs.sqlalchemy.org/en/rel_0_9/core/metadata.html#sqlalchemy.schema.MetaData.params.reflect). –

4

Объект метаданных, с которым были созданы таблицы, имеет то, что в словаре.

metadata.tables.keys() 
30

Существует метод в engine объекта для извлечения списка имен таблиц. engine.table_names()

+0

я получаю 'Traceback (самый последний вызов последнего): Файл " dedup_jobs.py", строка 31, в печати (engine.table_names()) Файл«/Users/darshanchoudhary/.virtualenvs/services/lib/ python3.6/site-packages/sqlalchemy/engine/base.py ", строка 2128, в table_names return self.dialect.get_table_names (conn, schema) value = value.replace (self.escape_quote, self.escape_to_quote) AttributeError: объект «NoneType» не имеет атрибута «replace» (усеченный стек) –

6

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

from sqlalchemy import create_engine 
    eng = create_engine('mysql+pymysql://root:[email protected]:3306', pool_recycle=3600) 
    q = eng.execute('SHOW TABLES') 

    available_tables = q.fetchall() 

Это делает выполнение и возвращает все таблицы.

обновление:

Postgres:

eng = create_engine('postgresql+psycopg2://root:[email protected]/ 
q = eng.execute('SELECT * FROM pg_catalog.pg_tables') 
+3

Это не кросс-платформенный. Он будет работать только с mysql, он не будет работать с другими механизмами баз данных. –

+0

@EdwardBetts, вы правы, что за двигатель db вы задумывались? – jmunsch

1

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

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

справочном http://docs.sqlalchemy.org/en/latest/core/reflection.html

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^