2011-06-24 23 views

Respuesta

52

Todas las tablas se recopilan en el atributo tables del objeto MetaData sqlalchemy. que acaba de obtener una lista de los nombres de las tablas:

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

Si está utilizando la extensión declarativa, entonces es probable que esté manejando los metadatos no se. Afortunadamente, los metadatos todavía está presente en la clase base,

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

Si usted está tratando de averiguar qué tablas están presentes en su base de datos, incluso entre los que ni siquiera han contado sobre sqlalchemy todavía, entonces se puede usa la reflexión de la mesa. sqlalchemy inspeccionará la base de datos y actualizará los metadatos con todas las tablas faltantes.

>>> metadata.reflect(engine) 
+3

Desaprobado desde la versión 0.8: utilice el método sqlalchemy.schema.MetaData.reflect(). Y fíjate, usa 'engine = sqlalchemy.create_engine ('mysql: // usuario: contraseña @ host/nombre_db')' en lugar de '" mysql: // usuario: contraseña @ host "' y 'engine.execute (" use db_name ")'. –

+0

@XuJiawan: No estoy seguro de qué cosa está obsoleta aquí, no estoy seguro de qué método estoy sugiriendo si no es 'sqlalchemy.MetaData.reflect()'? – SingleNegationElimination

+0

@IfLoop: lo encontré en [el documento sqlalchemy] (http://docs.sqlalchemy.org/en/rel_0_9/core/metadata.html#sqlalchemy.schema.MetaData.params.reflect). –

4

El objeto de metadatos con el que ha creado las tablas tiene eso en un diccionario.

metadata.tables.keys() 
30

No es un método en el engine objeto a buscar a la lista de nombre de tablas. engine.table_names()

+0

me sale 'Rastreo (llamada más reciente pasado): Archivo "dedup_jobs.py", línea 31, en de impresión (engine.table_names()) Archivo "/Users/darshanchoudhary/.virtualenvs/services/lib/ python3.6/site-packages/sqlalchemy/engine/base.py ", línea 2128, en table_names return self.dialect.get_table_names (conn, schema) value = value.replace (self.escape_quote, self.escape_to_quote) AttributeError: el objeto 'NoneType' no tiene ningún atributo 'replace'' (pila truncada) –

6

que estaba buscando algo como esto:

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() 

Se hace un ejecuta y devuelve todas las tablas.

actualización:

Postgres:

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

Esto no es multiplataforma. Solo funcionará con mysql, no funcionará con otros motores de base de datos. –

+0

@EdwardBetts tienes razón, ¿qué motor db te preguntabas? – jmunsch

1

reflejo de todas las tablas a la vez le permite recuperar los nombres de tabla ocultos también. He creado algunas tablas temporales y que se presentó con

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

Referencia http://docs.sqlalchemy.org/en/latest/core/reflection.html

2
from sqlalchemy import create_engine 
engine = create_engine('postgresql://use:[email protected]/DBname') 
print (engine.table_names()) 
0

Estoy resolver mismo problema y encontré este post. Después de algún intento de ejecución, sugeriría el uso de abajo para una lista de todas las tablas: (mencionado por zerocog)

metadata = MetaData() 
metadata.reflect(bind=engine) 
for table in metadata.sorted_tables: 
    print(table) 

Esto es útil para la manipulación directa de mesa y me siento es recomendable.

Y utilizar a continuación código para obtener los nombres de tabla:

for table_name in engine.table_names(): 
    print(table_name) 

"metadata.tables" proporciona un diccionario de nombre de tabla y objeto de tabla. que también sería útil para consultas rápidas.

Cuestiones relacionadas