在用户定义函数中将表名作为参数传递

2024-04-29 12:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个包含参数化查询的UDF。因为我想重用这个函数,所以我还想参数化表名。在雪花数据仓库(或Oracle,因为它在语法方面有点相似)中可能实现这一点吗?在

我不认为只用SQL就可以做到这一点。有没有关于如何使用Python实现它的输入?在


Tags: 函数sql参数语法数据仓库oracle雪花udf
3条回答

@MarcinZukowski谢谢你的信息。是的,我查过了,他们计划在6月份推出。我只需要在UDF中查询PK约束,而不需要在UDF中。 我的CSV如下所示,其中有表名及其主键:

|  Table Name  |  Primary Key  | 
|    Table 1   |     Col1      |  
|    Table 1   |     Col2      |
|    Table 1   |     Col3      | 
|    Table 2   |     Col11     | 
|    Table 2   |     Col12     | 

我想对这个CSV中的每个表执行下面的查询。这里表名可以是单参数,但列名必须是可变的,因为表可以有一个或多个主键。在

^{pr2}$

在Oracle中不能将表名用作绑定变量。查询在编译时解析,而不是在运行时解析。必须使用^{}或{a2}。在

这是一个非常基本的编程问题,与雪花无关。所以你在问之前应该多调查一下。但下面是一个简单的答案:

#!/usr/bin/env python

# Connect to Snowflake
# See https://docs.snowflake.net/manuals/user-guide/python-connector-example.html#connecting-
...
con = 
...

# Scan the file to build the table/column info
tables = {}
with open("zz.csv") as f:
    for l in f.readlines():
        tname, cname = l.split(",")
        tables.setdefault(tname.strip(), []).append(cname.strip())

# Run a query for each query
for tname, clist in tables.iteritems():
    query = """select {columns} from {table} 
               group by {columns} 
               having count(*) > 1
            """.format(columns=",".join(clist), table=tname)
    print("Running query: {0}".format(query))
    cur = con.cursor()
    cur.execute(query)
    for rec in cur:
        print("DUPLICATED RECORD: {0}".format(rec))

相关问题 更多 >