如何使用 pypika 查询访问信息模式?

How to access information schema using a pypika query?

我正在尝试使用 PyPika SQL 查询从 Azure SQL 数据库中的 table 获取列的名称,但将 运行 保存到麻烦。这是我用来生成查询的代码:

def dbView(table):
    infoSchema = ppk.Table("INFORMATION_SCHEMA.COLUMNS")
    return ppk.MSSQLQuery.from_(infoSchema).select(infoSchema.COLUMN_NAME).where(infoSchema.TABLE_NAME == table)

我创建了另一个函数,它使用 PyODBC 库从查询中获取 SQL,对数据库执行它,return 所有行:

def getData(query: ppk.Query):
    '''
    Execute a query against the Azure db and return 
    every row in the results list.
    '''

    print("QUERY: ", query.get_sql())
    conn = getConnection()
    with conn.cursor() as cursor:
        cursor.execute(query.get_sql())
        return cursor.fetchall()

我知道 getData() 函数有效,因为当我向它传递一个简单的 select 查询时,一切正常。但是,当我尝试使用上面由 pypika 生成的查询时,出现以下错误:

pyodbc.ProgrammingError: ('42S02', "[42S02] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'INFORMATION_SCHEMA.COLUMNS'. (208) (SQLExecDirectW)")

为了确保这不仅仅是某种权限错误,我手写了以下查询并使用 getData() 函数执行它并且它运行良好:

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Validation'

我还将pypika生成的查询打印到控制台。唯一的区别似乎是添加了一些双引号:

SELECT "COLUMN_NAME" FROM "INFORMATION_SCHEMA.COLUMNS" WHERE "TABLE_NAME"='Validation'

我做错了什么?出于某种原因,此错误似乎仅限于信息模式 table,因为我在我的代码中多次使用类似的查询而没有问题。我知道我可以只使用我手写的查询,但使用 PyPika 的目的是让我所有的 SQL 查询更具可读性和可重用性——最好理解为什么它在这个中不起作用非常具体的情况。

谢谢!

它显然有一个 API 到 schema-qualify 个表。

from pypika import Table, Query, Schema

views = Schema('views')

q = Query.from_(views.customers).select(customers.id, customers.phone)

https://pypika.readthedocs.io/en/latest/2_tutorial.html#tables-columns-schemas-and-databases