Não consegui encontrar nenhuma informação sobre isso na documentação, mas como posso obter uma lista das tabelas criadas no SQLAlchemy?
Usei o método de classe para criar as tabelas.
Não consegui encontrar nenhuma informação sobre isso na documentação, mas como posso obter uma lista das tabelas criadas no SQLAlchemy?
Usei o método de classe para criar as tabelas.
Respostas:
Todas as tabelas são coletadas no tables
atributo do objeto SQLAlchemy MetaData. Para obter uma lista dos nomes dessas tabelas:
>>> metadata.tables.keys()
['posts', 'comments', 'users']
Se você estiver usando a extensão declarativa, provavelmente não está gerenciando os metadados sozinho. Felizmente, os metadados ainda estão presentes na classe base,
>>> Base = sqlalchemy.ext.declarative.declarative_base()
>>> Base.metadata
MetaData(None)
Se você está tentando descobrir quais tabelas estão presentes em seu banco de dados, mesmo entre aquelas sobre as quais você ainda não disse ao SQLAlchemy, então você pode usar a reflexão de tabela. SQLAlchemy irá então inspecionar o banco de dados e atualizar os metadados com todas as tabelas ausentes.
>>> metadata.reflect(engine)
Para Postgres, se você tiver vários esquemas, precisará fazer um loop por todos os esquemas no mecanismo:
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
argumento para MetaData.__init__
, um sinalizador booleano, está obsoleto em favor do uso MetaData.reflect()
, exatamente como mostrei em minha resposta.
MetaData.reflect()
método dessa forma. E também comente para outra pessoa que possa ter o mesmo problema causado pela declaração do motor.
Existe um método no engine
objeto para buscar o nome da lista de tabelas.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'
(pilha truncada)
DB.engine.table_names()
ou qualquer que seja o nome da variável do banco de dados.
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
engine.table_names()
Dentro do interpretador python, use db.engine.table_names ()
$ python
>>> from myapp import db
>>> db.engine.table_names()
Eu estava procurando por algo parecido com isto:
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()
Ele executa e retorna todas as tabelas.
atualizar:
Postgres:
eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
Estou resolvendo mesmo problema e encontrei este post. Depois de executar algumas tentativas, sugiro usar abaixo para listar todas as tabelas: (mencionado por zerocog)
metadata = MetaData()
metadata.reflect(bind=engine)
for table in metadata.sorted_tables:
print(table)
Isso é útil para o manuseio direto da mesa e acho que é recomendado.
E use o código abaixo para obter os nomes das tabelas:
for table_name in engine.table_names():
print(table_name)
"metadata.tables" fornece um Dict para o nome da tabela e o objeto Table. o que também seria útil para uma consulta rápida.
reflect
, metadata.sorted_tables
não funcionará
Refletir todas as tabelas de uma vez permite que você recupere nomes de tabelas ocultos também. Eu criei algumas tabelas temporárias e elas apareceram com
meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
print table
Referência http://docs.sqlalchemy.org/en/latest/core/reflection.html
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
vez de"mysql://user:password@host"
eengine.execute("use db_name")
.