首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用pypika查询访问信息架构?

如何使用pypika查询访问信息架构?
EN

Stack Overflow用户
提问于 2022-02-24 20:02:28
回答 1查看 346关注 0票数 0

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

代码语言:javascript
复制
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,对数据库执行它,并返回所有行:

代码语言:javascript
复制
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生成的查询时,我会得到以下错误:

代码语言:javascript
复制
pyodbc.ProgrammingError: ('42S02', "[42S02] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'INFORMATION_SCHEMA.COLUMNS'. (208) (SQLExecDirectW)")

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

代码语言:javascript
复制
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Validation'

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

代码语言:javascript
复制
SELECT "COLUMN_NAME" FROM "INFORMATION_SCHEMA.COLUMNS" WHERE "TABLE_NAME"='Validation'

我做错了什么?由于某些原因,此错误似乎仅限于特定的信息模式表,因为我在代码中使用过其他几次类似的查询,没有问题。我知道我可以直接使用我手工编写的查询,但是使用PyPika的目的是使我的所有SQL查询更加可读性和可重用性--理解为什么它在这种非常特殊的情况下不能工作是很好的。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71257612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档