我正在尝试使用PyPika SQL查询从Azure数据库中的表中获取列的名称,但始终遇到麻烦。下面是我用来生成查询的代码:
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()函数可以工作,因为当我传递给它一个简单的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'我做错了什么?由于某些原因,此错误似乎仅限于特定的信息模式表,因为我在代码中使用过其他几次类似的查询,没有问题。我知道我可以直接使用我手工编写的查询,但是使用PyPika的目的是使我的所有SQL查询更加可读性和可重用性--理解为什么它在这种非常特殊的情况下不能工作是很好的。
谢谢!
发布于 2022-02-24 20:29:55
显然,它有一个用于模式限定表的API。
来自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
https://stackoverflow.com/questions/71257612
复制相似问题