SQLAlchemy - 获取表的列表

sid*_*der 85 python mysql sqlalchemy pyramid

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

我使用类方法来创建表.

Sin*_*ion 77

所有表都收集在tablesSQLAlchemy MetaData对象的属性中.要获取这些表的名称列表:

>>> metadata.tables.keys()
['posts', 'comments', 'users']
Run Code Online (Sandbox Code Playgroud)

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

>>> Base = sqlalchemy.ext.declarative.declarative_base()
>>> Base.metadata
MetaData(None)
Run Code Online (Sandbox Code Playgroud)

如果你想弄清楚你的数据库中有哪些表,即使你还没有告诉过SQLAlchemy,那么你可以使用表反射.然后,SQLAlchemy将检查数据库并使用所有缺失的表更新元数据.

>>> metadata.reflect(engine)
Run Code Online (Sandbox Code Playgroud)

  • 自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 ")`. (6认同)
  • @IfLoop:非常抱歉我的英语不好.你的答案是完全正确的,我已经提升了.我添加该注释只是为了让人们注意到如果他们使用版本<0.8,他们可能不会以这种方式使用`MetaData.reflect()`方法.并且还可以为可能由引擎声明引起的相同问题的其他人发表评论. (2认同)

Zub*_*lam 58

engine对象中有一个方法来获取表名列表.engine.table_names()

  • 这已被弃用,您现在必须使用 ``` from sqlalchemy import create_engine engine = create_engine(self.__connection_string) insp =spect(engine) return insp.get_table_names() ``` (12认同)

Jea*_*net 45

  • 要获取数据库中所有现有表的列表:

从 SQLAlchemy 1.4 开始:https://docs.sqlalchemy.org/en/14/core/reflection.html#fine-grained-reflection-with-inspector

from sqlalchemy import create_engine
from sqlalchemy import inspect
engine = create_engine('...')
insp = inspect(engine)
print(insp.get_table_names())
Run Code Online (Sandbox Code Playgroud)

旧方法 ( engine.table_names()) 产量:

SADeprecationWarning: The from_engine() method on Inspector is deprecated and will be removed in a future release. Please use the sqlalchemy.inspect() function on an Engine or Connection in order to acquire an Inspector. (deprecated since: 1.4)

  • 要获取已声明表的列表,请使用接受的答案:metadata.tables.keys()


小智 33

from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
Run Code Online (Sandbox Code Playgroud)

  • 这已被弃用,您必须使用 ``` from sqlalchemy import create_engine engine = create_engine(self.__connection_string) insp =spect(engine) return insp.get_table_names() ``` (7认同)
  • 这是截至2018年11月有效的正确答案。 (3认同)

jmu*_*sch 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()
Run Code Online (Sandbox Code Playgroud)

它执行一个execute并返回所有表.

更新:

Postgres的:

eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
Run Code Online (Sandbox Code Playgroud)

  • 这不是跨平台的.它只适用于mysql,它不能与其他数据库引擎一起使用. (3认同)

小智 9

我个人这样做并且有效:

from sqlalchemy import inspect
inspector = inspect(engine)
inspector.get_table_names()
Run Code Online (Sandbox Code Playgroud)

它为我提供了数据库中的所有名称。


Han*_*ang 7

就这么简单:

from sqlalchemy import inspect

inspect(engine).get_tables_names()

# engine.table_names()  # Deprecated after 1.4
Run Code Online (Sandbox Code Playgroud)

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

engine.has_table(table_name)
Run Code Online (Sandbox Code Playgroud)


Kei*_*ith 5

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

metadata.tables.keys()
Run Code Online (Sandbox Code Playgroud)


use*_*731 5

我正在解决同样的问题并找到了这篇文章。经过一些尝试运行后,我建议使用下面列出所有表:(由 zerocog 提及)

metadata = MetaData()
metadata.reflect(bind=engine)
for table in metadata.sorted_tables:
    print(table)
Run Code Online (Sandbox Code Playgroud)

这对于直接处理表格很有用,我觉得是推荐的。

并使用以下代码获取表名:

for table_name in engine.table_names():
    print(table_name)
Run Code Online (Sandbox Code Playgroud)

“metadata.tables”为表名和表对象提供了一个字典。这对于快速查询也很有用。


Mwi*_*Tim 5

在python解释器中,使用db.engine.table_names()

$ python
>>> from myapp import db
>>> db.engine.table_names()
Run Code Online (Sandbox Code Playgroud)

  • 注意:这不适用于 SQLAlchemy 2.0 (3认同)