使用SQLAlchemy列出数据库表

drg*_*xfs 41 python database sqlalchemy

我想实现一个函数,它提供有关数据库中存在的所有表(及其列名)的信息(不仅仅是使用SQLAlchemy创建的表).在阅读文档时,在我看来,这是通过反射完成的,但我没有设法使某些工作正常.有关如何执行此操作的任何建议或示例?

zzz*_*eek 76

从引擎开始:

from sqlalchemy import create_engine
engine = create_engine("postgresql://u:p@host/database")
Run Code Online (Sandbox Code Playgroud)

所有表/列名称的快速路径,使用检查器:

from sqlalchemy import inspect
inspector = inspect(engine)

for table_name in inspector.get_table_names():
   for column in inspector.get_columns(table_name):
       print("Column: %s" % column['name'])
Run Code Online (Sandbox Code Playgroud)

docs:http://docs.sqlalchemy.org/en/rel_0_9/core/reflection.html? highlight= inspector# fine-grained-reflection-with- inspector

或者,使用MetaData/Tables:

from sqlalchemy import MetaData
m = MetaData()
m.reflect(engine)
for table in m.tables.values():
    print(table.name)
    for column in table.c:
        print(column.name)
Run Code Online (Sandbox Code Playgroud)

文档:http://docs.sqlalchemy.org/en/rel_0_9/core/reflection.html#reflecting-all-tables-at-once

  • 使用`inspect` vs`reflection`有任何好处(或不利方面)吗? (5认同)

Roh*_*hit 5

首先设置 sqlalchemy 引擎。

from sqlalchemy import create_engine, inspect, text
from sqlalchemy.engine import url

connect_url = url.URL(
    'oracle',
    username='db_username',
    password='db_password',
    host='db_host',
    port='db_port',
    query=dict(service_name='db_service_name'))

engine = create_engine(connect_url)

try:
    engine.connect()
except Exception as error:
    print(error)
    return
Run Code Online (Sandbox Code Playgroud)

就像其他人提到的那样,您可以使用检查方法来获取表名称。

但就我而言,检查方法返回的表列表不完整。

因此,我找到了另一种在 sqlalchemy 中使用纯 SQL 查询来查找表名的方法。

query = text("SELECT table_name FROM all_tables where owner = '%s'"%str('db_username'))

table_name_data = self.session.execute(query).fetchall()
Run Code Online (Sandbox Code Playgroud)

只是为了答案的完整性,这里是通过检查方法获取表名称的代码(如果它适合您的情况)。

inspector = inspect(engine)
table_names = inspector.get_table_names()
Run Code Online (Sandbox Code Playgroud)