SQLAlchemy - 获取表列表

问题描述 投票:0回答:18

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

我使用类方法来创建表。

python mysql sqlalchemy pyramid
18个回答
154
投票

所有表都收集在 SQLAlchemy MetaData 对象的

tables
属性中。要获取这些表的名称列表:

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

105
投票

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


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

38
投票
  • 获取数据库中所有现有表的列表:

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

14
投票

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

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

10
投票

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

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

9
投票

我个人这样做并且有效:

from sqlalchemy import inspect
inspector = inspect(engine)
inspector.get_table_names()

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


7
投票

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

metadata.tables.keys()

7
投票

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


7
投票

就这么简单:

engine.table_names()

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

engine.has_table(table_name)

4
投票

最好的方法是使用

inspect

  1. 创建检查器并将其连接到引擎
  2. 收集数据库中表的名称
  3. 收集表列名称
from sqlalchemy import create_engine, inspect

engine = create_engine("sqlite:///../Resources/dow.sqlite")
conn = engine.connect()
inspector = inspect(conn)
inspector.get_table_names() #returns "dow"

columns = inspector.get_columns('dow')

for column in columns:
    print(column["name"], column["type"])

4
投票

这是我截至 2021 年 10 月 22 日使用的:

import sqlalchemy as sql

engine = sql.create_engine("connection_string")

sql.inspect(engine).get_table_names()

3
投票

一次反映所有表还允许您检索隐藏的表名称。我创建了一些临时表,它们出现了

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

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


3
投票

如果您使用 Flask-SQLAlchemy,您可以从数据库实例中获取它们

[...]
db = SQLAlchemy(app)
db.engine.table_names() # you'll get a list of all the table names in your database

3
投票

我使用列表理解来提取表名称,它对我有用

# Import necessary module
from sqlalchemy import create_engine
from sqlalchemy import MetaData

# Create engine: engine
engine = create_engine('sqlite:///database.sqlite')

metadata = MetaData()
metadata.reflect(bind=engine)

table_names = [table.name for table in metadata.tables.values()]

print(table_names)

1
投票

显示所有列信息的完整示例。假设变量

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

0
投票

单衬垫:

sqlalchemy.inspect(my_connection.engine).get_table_names()

地点:

my_engine = sqlalchemy.create_engine(f"{dialect}+{driver}://{login}:{password}@{host}/{db_name}")

my_connection = my_engine.connect().execution_options(schema_translate_map={None: schema})

0
投票

为此,您可以按照以下步骤操作:

from sqlalchemy import create_engine, inspect

#Create a SQLAlchemy engine object with your database URL
engine = create_engine('sqlite:///my_db.sqlite')

#Create an SQLAlchemy inspector
inspector = inspect(engine)

#Get a list of the table names from the inspector
table_names = inspector.get_table_names()

#Loop through the table names and print them
for table_name in table_names:
    print(table_name)

您可以在这篇文章中从PythonHint

找到更多方法
© www.soinside.com 2019 - 2024. All rights reserved.