如何列出SQLAlchemy语句中涉及的所有表

时间:2017-06-14 17:00:04

标签: python sqlalchemy

如何列出SQLAlchemy语句中涉及的所有表? 我们假设我们有以下查询

query = session.query(Address).filter(Address.person == person)

如何列出此查询使用的表 在这种情况下:人,地址

2 个答案:

答案 0 :(得分:2)

您可以从locate_all_froms获取所有表格,例如

from sqlalchemy import Table
from sqlalchemy.sql.selectable import Alias

tables = set()
for f in query.statement.locate_all_froms():
    if isinstance(f, Table):
        tables.add(f)
    elif isinstance(f, Alias):
        tables.add(f.element)

答案 1 :(得分:1)

r-m-n答案很好,但它不处理所有情况,子查询,删除语句,存在语句等

这是提取所有表格的一般方法

from sqlalchemy.sql.visitors import ClauseVisitor
from sqlalchemy import Table


def extract_tables(sql_stmt):
    tables = []
    visitor = ClauseVisitor()
    cluase_iter = visitor.iterate(elem)
    for e in cluase_iter:
        if isinstance(e, Table):
            tables.append(e)
        if isinstance(e, (ValuesBase, UpdateBase)):
            tables.append(e.table)
    return set(tables)