SQLAlchemy-获取表列表


94

我在文档中找不到与此有关的任何信息,但是如何获得在SQLAlchemy中创建的表的列表?

我使用了类方法来创建表。

Answers:


86

所有表都收集在tablesSQLAlchemy 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)

7
从版本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")
Java徐

@XuJiawan:我不确定这里不赞成使用哪种方法,我不确定是否建议使用哪种方法sqlalchemy.MetaData.reflect()
SingleNegationElimination

@IfLoop:我从sqlalchemy 文档中找到了它。
Java Xu

1
@XuJiawan:链接表明reflect 论证MetaData.__init__,一个布尔标志,已被弃用赞成使用的MetaData.reflect(),正如我在答复中表示。
SingleNegationElimination

2
@IfLoop:非常抱歉我的英语不好。您的回答是正确的,我已经提高了。我添加该评论只是为了让人们注意到,如果他们使用版本<0.8,他们可能不会MetaData.reflect()以这种方式使用方法。并为可能由于引擎声明引起相同问题的其他人添加注释。
Java Xu

76

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'(堆栈被截断)
Darshan Chaudhary

这也适用于Flask-SQLAlchemy,因为可以通过例如DB.engine.table_names()或任何数据库变量名直接访问引擎
colidyre

41
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())

3
这是截至2018
。– Austin Mackillop

如果它不起作用,则最有可能是因为引擎无法正确连接(因此第2行出现问题),但是直到运行,您才会收到错误消息engine.table_names()
grofte

用这个答案的人。
Manakin


11

我一直在寻找这样的东西:

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

3
这不是跨平台的。它仅适用于mysql,不适用于其他数据库引擎。
爱德华·贝茨

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

OP要求使用postgres而不是sql
o elhajoui,

4

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

metadata.tables.keys()

4

我正在解决相同的问题,并找到了这篇文章。经过一些尝试运行后,我建议使用下面的方法列出所有表:(由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。这对于快速查询也很有用。


这个!没有reflectmetadata.sorted_tables将无法工作


2

就这么简单:

engine.table_names()

另外,要测试表是否存在:

engine.has_table(table_name)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.