问题
I couldn't find any information about this in the documentation, but how can I get a list of tables created in SQLAlchemy?
I used the class method to create the tables.
回答1:
All of the tables are collected in the tables
attribute of the SQLAlchemy MetaData object. To get a list of the names of those tables:
>>> metadata.tables.keys()
['posts', 'comments', 'users']
If you're using the declarative extension, then you probably aren't managing the metadata yourself. Fortunately, the metadata is still present on the baseclass,
>>> Base = sqlalchemy.ext.declarative.declarative_base()
>>> Base.metadata
MetaData(None)
If you are trying to figure out what tables are present in your database, even among the ones you haven't even told SQLAlchemy about yet, then you can use table reflection. SQLAlchemy will then inspect the database and update the metadata with all of the missing tables.
>>> metadata.reflect(engine)
For Postgres, if you have multiple schemas, you'll need to loop thru all the schemas in the engine:
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)
回答2:
There is a method in engine
object to fetch the list of tables name. engine.table_names()
回答3:
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
回答4:
Within the python interpreter use db.engine.table_names()
$ python
>>> from myapp import db
>>> db.engine.table_names()
回答5:
I was looking for something like this:
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()
It does an execute and returns all of the tables.
update:
Postgres:
eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
回答6:
The metadata object that you created the tables with has that in a dictionary.
metadata.tables.keys()
回答7:
I'm solving same problem and found this post. After some try run, I would suggest use below to list all tables: (mentioned by zerocog)
metadata = MetaData()
metadata.reflect(bind=engine)
for table in metadata.sorted_tables:
print(table)
This is useful for direct table handling and I feel is recommended.
And use below code to get table names:
for table_name in engine.table_names():
print(table_name)
"metadata.tables" provides a Dict for table name and Table object. which would also be useful for quick query.
回答8:
Reflecting All Tables at Once allows you to retrieve hidden table names too. I created some temporary tables and they showed up with
meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
print table
Reference http://docs.sqlalchemy.org/en/latest/core/reflection.html
回答9:
Just this simple:
engine.table_names()
Also, to test whether a table exists:
engine.has_table(table_name)
回答10:
The best way is to use inspect
:
- Create the inspector and connect it to the engine
- Collect the names of tables within the database
- Collect Table columns names
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"])
来源:https://stackoverflow.com/questions/63272069/how-to-get-table-names-from-sqlalchemy