2011-06-24 65 views

回答

52

所有这些表都收集在sqlalchemy元数据对象的tables属性中。以获得这些表名称的列表:

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

如果您使用声明性扩展,那么您可能不是自己管理元数据。幸运的是,元数据仍然存在于基类,

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

如果你正在试图找出哪些表存在于数据库中,即使在你还没有还跟SQLAlchemy的了解尚的人,那么你就可以使用表反射。然后,sqlalchemy将检查数据库并使用所有缺少的表更新元数据。

>>> metadata.reflect(engine) 
+3

从版本0.8开始不推荐使用:请使用sqlalchemy.schema.MetaData.reflect()方法。注意,使用'engine = sqlalchemy.create_engine('mysql:// user:password @ host/db_name')''而不是'“mysql:// user:password @ host”'和'engine.execute(“use db_name “)'。 –

+0

@XuJiawan:我不确定哪个东西在这里被弃用,我不确定哪个方法在暗示它是不是'sqlalchemy.MetaData.reflect()'? – SingleNegationElimination

+0

@IfLoop:我从[sqlalchemy文档]找到它(http://docs.sqlalchemy.org/en/rel_0_9/core/metadata.html#sqlalchemy.schema.MetaData.params.reflect)。 –

4

您创建表的元数据对象在字典中具有该元数据对象。

metadata.tables.keys() 
30

有一种方法在engine对象中获取表名列表。 engine.table_names()

+0

我得到 '回溯(最近最后一次通话): 文件 “dedup_jobs.py” 31行,在 打印(engine.table_names()) 文件“/Users/darshanchoudhary/.virtualenvs/services/lib/ python3.6/site-packages/sqlalchemy/engine/base.py“,第2128行,在table_names中 return self.dialect.get_table_names(conn,schema) value = value.replace(self.escape_quote,self.escape_to_quote) AttributeError:'NoneType'对象没有'replace''属性 (堆栈被截断) –

6

我一直在寻找这样的事情:

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

它的执行,并返回所有的表。

更新:

Postgres的:

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

这不是跨平台的。它只适用于mysql,它不会与其他数据库引擎一起工作。 –

+0

@EdwardBetts你是对的,你想知道什么数据库引擎? – jmunsch

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

出现了我解决同样的问题,发现这个职位。一些试运行结束后,我会建议使用下面列出的所有表:(由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”提供了字典的表名和表对象。这对快速查询也很有用。