Answers:
所有表都收集在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'
(堆栈被截断)
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。这对于快速查询也很有用。
reflect
,metadata.sorted_tables
将无法工作
一次反映所有表允许您也检索隐藏的表名。我创建了一些临时表,他们出现了
meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
print table
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
而不是"mysql://user:password@host"
和engine.execute("use db_name")
。