使用SQLAlchemy列出数据库表

时间:2014-01-23 14:09:51

标签: python database sqlalchemy

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

5 个答案:

答案 0 :(得分:70)

从引擎开始:

from sqlalchemy import create_engine
engine = create_engine("postgresql://u:p@host/database")

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

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

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)

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

答案 1 :(得分:3)

嘿,我创建了一个小模块,可以帮助您轻松反映与SQLAlchemy连接的数据库中的所有表,看看:EZAlchemy

from EZAlchemy.ezalchemy import EZAlchemy

DB = EZAlchemy(
    db_user='username',
    db_password='pezzword',
    db_hostname='127.0.0.1',
    db_database='mydatabase',
    d_n_d='mysql'   # stands for dialect+driver
)

# this function loads all tables in the database to the class instance DB
DB.connect()

# List all associations to DB, you will see all the tables in that database
dir(DB)

答案 2 :(得分:0)

尽管reflection/inspection很有用,但是我很难将数据从数据库中取出。我发现sqlsoup更加用户友好。您使用sqlalchemy创建引擎,并将该引擎传递给sqlsoup.SQlSoup。即:

import sqlsoup

def create_engine():
    from sqlalchemy import create_engine
    return create_engine(f"mysql+mysqlconnector://{database_username}:{database_pw}@{database_host}/{database_name}")

def test_sqlsoup():
    engine = create_engine()
    db = sqlsoup.SQLSoup(engine)
    # Note: database must have a table called 'users' for this example
    users = db.users.all()
    print(users)

if __name__ == "__main__":
    test_sqlsoup()

如果您熟悉sqlalchemy,则您熟悉sqlsoup。我用它来从wordpress数据库中提取数据。

答案 3 :(得分:0)

首先设置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

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

但是对于我而言,inspect方法返回的表列表不完整。

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

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

table_name_data = self.session.execute(query).fetchall()

仅出于回答完整性的考虑,以下是通过inspect方法获取表名的代码(如果在您的情况下可行)。

inspector = inspect(engine)
table_names = inspector.get_table_names()

答案 4 :(得分:0)

我提出了另一种解决方案,因为在使用 schemaspostgres 的情况下,我对之前的任何解决方案都不满意。我通过查看 pandas source code 共同破解了这个解决方案。

from sqlalchemy import MetaData, create_engine
from typing import List

def list_tables(pg_uri: str, schema: str) -> List[str]:
    with create_engine(pg_uri).connect() as conn:
        meta = MetaData(conn, schema=schema)
        meta.reflect(views=True)
        return list(meta.tables.keys())

为了获取架构中所有表的列表,您需要形成 postgres 数据库 uri pg_uri(例如 zzzeek 的答案中的 "postgresql://u:p@host/database")以及架构名称 {{ 1}}。因此,如果我们使用示例 uri 以及典型架构 schema,我们将获得所有表和视图:

public