如何使用 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
我正在尝试使用 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