[雪花python连接器]如何在字符串格式内进行绑定

时间:2019-11-01 06:58:23

标签: python snowflake-data-warehouse

我想在执行sql时使用数据绑定。 我只想在字符串的中间进行绑定,但这是行不通的。

我尝试了以下操作,但所有操作均导致执行错误。

Python

param = {
    "env": "dev"
    "s3_credential": "secret"
}
cursor().execute(sql, param)

sql1

CREATE OR REPLACE STAGE my_s3_stage_demo
    URL='s3://my-stage-demo-'%(env)s'/tmp/'
    credentials = (aws_role = %(s3_credential)s )
    FILE_FORMAT = ( TYPE=JSON);

错误消息1

snowflake.connector.errors.ProgrammingError: 091006 (22000): Bucket name 'my-stage-demo-'dev'' in the stage location is not supported. Valid bucket names must consist of lowercase letters, digits, hyphens '-', and periods '.'.

SQL2

CREATE OR REPLACE STAGE my_s3_stage_demo
    URL='s3://my-stage-demo-%(env)s/tmp/'
    credentials = (aws_role = %(s3_credential)s )
    FILE_FORMAT = ( TYPE=JSON);

错误消息2

snowflake.connector.errors.ProgrammingError: 001003 (42000): SQL compilation error:
syntax error line 2 at position 32 unexpected ''/tmp/''.

我想按以下方式执行绑定结果,但是我应该如何指定呢?

CREATE OR REPLACE STAGE my_s3_stage_demo
    URL='s3://my-stage-demo-dev/tmp/'
    credentials = (aws_role = "secret" )
    FILE_FORMAT = ( TYPE=JSON);

1 个答案:

答案 0 :(得分:0)

您不能绑定子字符串,只能绑定完整的语法元素。

在Python中,您可以执行以下操作:

cursor.execute(
  "SELECT t.*, 'P'||:2 p2 FROM IDENTIFIER(:1) t",
  [['"my_db"."my_schema"."my_table"', '2. parameter']]
)

您只能使用允许使用表达式的值的一部分(例如上面的'P'||:2)。还提供了一些标识符,例如上面使用IDENTIFIER()的表名。

不幸的是,对于CREATE OR REPLACE STAGE命令,似乎根本不支持将表达式用于s3存储桶或绑定变量。 这意味着您必须使用替代SQL文本,而不是变量绑定。