SQLAlchemy - 获取表的列表

时间:2011-06-24 21:25:32

标签: python mysql sqlalchemy pyramid

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

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

11 个答案:

答案 0 :(得分:70)

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

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

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

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

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

>>> metadata.reflect(engine)

答案 1 :(得分:47)

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

答案 2 :(得分:18)

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

答案 3 :(得分: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()

执行execute并返回所有表。

<强>更新

Postgres的:

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

答案 4 :(得分:4)

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

metadata.tables.keys()

答案 5 :(得分:3)

我正在解决同样的问题并找到了这篇文章。经过一些尝试运行,我建议使用下面列出所有表:(由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”为表名和Table对象提供了一个Dict。这对快速查询也很有用。

答案 6 :(得分:3)

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

$ python
>>> from myapp import db
>>> db.engine.table_names()

答案 7 :(得分:2)

一次反映所有表格,您也可以检索隐藏的表格名称。我创建了一些临时表,他们出现了

meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
    print table

参考http://docs.sqlalchemy.org/en/latest/core/reflection.html

答案 8 :(得分:2)

就这么简单:

engine.table_names()

还要测试表是否存在:

engine.has_table(table_name)

答案 9 :(得分:2)

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

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

旧方法 (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()

答案 10 :(得分:0)

显示所有列信息的完整示例。假设变量 df 包含要写入 SQL 数据库的数据帧。

from sqlalchemy import create_engine, inspect
from sqlalchemy_utils.functions import database_exists, create_database

engine = create_engine('sqlite:///mydb.sqlite', echo=True)

if not database_exists(engine.url):
    create_database(engine.url)
else:
    engine.connect()

df.to_sql('MyTable', con=engine, if_exists='replace', index=False) # index=False avoids auto-creation of level_0 (name tiebreaker)

inspector = inspect(engine)
table_names = inspector.get_table_names()
for table_name in table_names:
    print(f"Table:{table_name}")
    column_items = inspector.get_columns(table_name)
    print('\t'.join(n for n in column_items[0]))
    for c in column_items:
        assert len(c) == len(column_items[0])
        print('\t'.join(str(c[n]) for n in c))