在Python中将数组参数传递给BigQuery的SQL

在Python中将数组参数传递给BigQuery的SQL,python,sql,google-bigquery,Python,Sql,Google Bigquery,我有一组ID~200k,我需要用这些ID获取BigQuery表中的所有行。我试图用python构造一个列表,并使用@将其作为参数传递给SQL查询,但我得到了TypeError:“ArrayQueryParameter”对象不是iterable错误。下面是我尝试的代码,非常类似: 对于数组元素类型,您需要使用“字符串”而不是“数组”,例如: query_parameters=( bigquery.ArrayQueryParameter('ids', 'STRING', id_list)

我有一组ID~200k,我需要用这些ID获取BigQuery表中的所有行。我试图用python构造一个列表,并使用@将其作为参数传递给SQL查询,但我得到了TypeError:“ArrayQueryParameter”对象不是iterable错误。下面是我尝试的代码,非常类似:

对于数组元素类型,您需要使用“字符串”而不是“数组”,例如:

query_parameters=(
    bigquery.ArrayQueryParameter('ids', 'STRING', id_list)
本主题的示例如下:

def query_array_params(gender, states):
    client = bigquery.Client()
    query = """
        SELECT name, sum(number) as count
        FROM `bigquery-public-data.usa_names.usa_1910_2013`
        WHERE gender = @gender
        AND state IN UNNEST(@states)
        GROUP BY name
        ORDER BY count DESC
        LIMIT 10;
        """
    query_job = client.run_async_query(
        str(uuid.uuid4()),
        query,
        query_parameters=(
            bigquery.ScalarQueryParameter('gender', 'STRING', gender),
            bigquery.ArrayQueryParameter('states', 'STRING', states)))
    query_job.use_legacy_sql = False

    # Start the query and wait for the job to complete.
    query_job.begin()
    wait_for_job(query_job)
    print_results(query_job.results())
对于数组元素类型,您需要使用“字符串”而不是“数组”,例如:

query_parameters=(
    bigquery.ArrayQueryParameter('ids', 'STRING', id_list)
本主题的示例如下:

def query_array_params(gender, states):
    client = bigquery.Client()
    query = """
        SELECT name, sum(number) as count
        FROM `bigquery-public-data.usa_names.usa_1910_2013`
        WHERE gender = @gender
        AND state IN UNNEST(@states)
        GROUP BY name
        ORDER BY count DESC
        LIMIT 10;
        """
    query_job = client.run_async_query(
        str(uuid.uuid4()),
        query,
        query_parameters=(
            bigquery.ScalarQueryParameter('gender', 'STRING', gender),
            bigquery.ArrayQueryParameter('states', 'STRING', states)))
    query_job.use_legacy_sql = False

    # Start the query and wait for the job to complete.
    query_job.begin()
    wait_for_job(query_job)
    print_results(query_job.results())

这里的问题可能是您没有向函数传递元组

请在关闭括号之前尝试添加逗号,如下所示:

id_list = ['id1', 'id2'] 
query = """
    SELECT id
    FROM `my-db`
    WHERE id in UNNEST(@ids)
"""
query_job = client.run_async_query(
    str(uuid.uuid4()),
    query,
    query_parameters=(
        bigquery.ArrayQueryParameter('ids', 'STRING', id_list),
    )
)
在Python中,如果执行以下操作:

t = (1)
t = (1,)
然后运行:

type(t)
您将发现结果为int。但如果您这样做:

t = (1)
t = (1,)

然后生成一个元组

这里的问题可能是您没有向函数传递元组

请在关闭括号之前尝试添加逗号,如下所示:

id_list = ['id1', 'id2'] 
query = """
    SELECT id
    FROM `my-db`
    WHERE id in UNNEST(@ids)
"""
query_job = client.run_async_query(
    str(uuid.uuid4()),
    query,
    query_parameters=(
        bigquery.ArrayQueryParameter('ids', 'STRING', id_list),
    )
)
在Python中,如果执行以下操作:

t = (1)
t = (1,)
然后运行:

type(t)
您将发现结果为int。但如果您这样做:

t = (1)
t = (1,)

然后生成一个元组

以上答案是一个更好的解决方案,但当你在笔记本上快速起草一些东西时,你可能也会发现这一点:

将列表转换为日期值字符串,以逗号分隔并用引号括起来。然后将字符串传递到查询中,如下所示:

id_list = ['id1', 'id2'] 
# format into a query valid string
id_string = '"'+'","'.join(id_list)+'"'

client = bigquery.Client()
query = f"""
    SELECT id
    FROM `my-db`
    WHERE id in {id_string}
"""
query_job=client.query(query) 
results = query_job.result()

上面的答案是一个更好的解决方案,但当你在笔记本上快速起草一些东西时,你可能也会发现这一点:

将列表转换为日期值字符串,以逗号分隔并用引号括起来。然后将字符串传递到查询中,如下所示:

id_list = ['id1', 'id2'] 
# format into a query valid string
id_string = '"'+'","'.join(id_list)+'"'

client = bigquery.Client()
query = f"""
    SELECT id
    FROM `my-db`
    WHERE id in {id_string}
"""
query_job=client.query(query) 
results = query_job.result()

您还设置了query\u job.use\u legacy\u sql=False,对吗?是的,我将其设置为False。啊,我想可能是因为query\u参数应该是元组。如果在bigquery.ArrayQueryParameter…周围加上一组括号会怎么样?我也想到了。bigquery.ArrayQueryParameter周围的单括号。。。使其成为一个元组,但似乎元组元素需要是可编辑的,在本例中,它们不是ArrayQueryParameter的实例。我也用双括号试过了,不走运。你也在设置query\u job.use\u legacy\u sql=False,对吗?是的,我把它设置为False。啊,我想可能是因为query\u参数应该是元组。如果在bigquery.ArrayQueryParameter…周围加上一组括号会怎么样?我也想到了。bigquery.ArrayQueryParameter周围的单括号。。。使其成为一个元组,但似乎元组元素需要是可编辑的,在本例中,它们不是ArrayQueryParameter的实例。我也用双括号试过了,运气不好。效果很好:我真不敢相信我花了两天时间在这上面!谢谢威尔。工作得很有魅力:我真不敢相信我花了两天时间在这上面!谢谢你会的。