0

我正在尝试使用 PyPika SQL 查询从 Azure SQL 数据库中的表中获取列的名称,但一直遇到麻烦。这是我用来生成查询的代码:

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,对数据库执行它,并返回所有行:

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() 函数有效,因为当我向它传递一个简单的选择查询时,一切正常。但是,当我尝试使用上面 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'

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

谢谢!

4

1 回答 1

2

它显然有一个用于模式限定表的 API。

from pypika 导入表、查询、模式

视图 = 架构('视图')

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

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

于 2022-02-24T20:29:55.727 回答