我正在尝试使用 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 查询更具可读性和可重用性——很高兴理解为什么它在这种非常特殊的情况下不起作用。
谢谢!