Я не міг знайти жодної інформації про це в документації, але як я можу отримати список таблиць, створених у SQLAlchemy?
Я використовував метод класу для створення таблиць.
Я не міг знайти жодної інформації про це в документації, але як я можу отримати список таблиць, створених у SQLAlchemy?
Я використовував метод класу для створення таблиць.
Відповіді:
Усі таблиці зібрані в 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)
sqlalchemy.MetaData.reflect()
?
reflect
аргумент до MetaData.__init__
, логічний прапор, застарілий на користь використання MetaData.reflect()
, точно так, як я показав у своїй відповіді.
MetaData.reflect()
метод таким чином. А також прокоментуйте це для когось іншого, хто може мати таку ж проблему, спричинену декларацією двигуна.
У 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'
(стек усічений)
DB.engine.table_names()
або інше ім'я змінної бази даних.
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
engine.table_names()
У інтерпретаторі python використовуйте db.engine.table_names ()
$ python
>>> from myapp import db
>>> db.engine.table_names()
Я шукав щось подібне:
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')
Я вирішую ту ж проблему і знайшов цю публікацію. Після деякої спроби запустити, я б запропонував використовувати нижче, щоб перерахувати всі таблиці: (згадується 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
не буде працювати
Відображення всіх таблиць одночасно дозволяє отримувати також приховані імена таблиць. Я створив кілька тимчасових таблиць, і вони з'явилися з
meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
print table
Довідка http://docs.sqlalchemy.org/en/latest/core/reflection.html
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
скоріше використовуйте , ніж"mysql://user:password@host"
таengine.execute("use db_name")
.