我創建了一個 python 類,我的一個方法是接收單個 ID 號或 ID 號串列。然后,該函式將使用 ID 號通過 .sql 腳本從 BigQuery 中的表中進行查詢。目前,該功能適用??于使用以下內容的單個 ID 號:
def state_data(self, state, id_number):
if state == 'NY':
sql_script = self.sql_scripts['get_data_ny']
else:
sql_script = self.sql_scripts['get_data_rest']
sql_script = sql_script.replace('@@id_number@@', id_number)
我在一次傳遞多個 ID 號碼時遇到問題。我嘗試了 3 種不同的方法,但沒有成功:
- 上述方法,將多個 ID 號作為元組傳入以與
WHERE ID_NUM IN('@@id_number@@'). 這不起作用,因為當呼叫 .sql 腳本時,會回傳語法錯誤,因為會自動添加括號和引號。例如,SQL 陳述句嘗試作為WHERE ID_NUM IN('('123', '124')'). 如果沒有兩組括號和引號中的一組,這將運行良好,但無論我嘗試傳入什么,它們總是會被添加。 - 我嘗試過的第二種技術是創建一個表,用傳入的 ID 號填充它,然后在 BQ 中加入更大的表。它是這樣的:
CREATE OR REPLACE TABLE ID_Numbers
(
ID_Number STRING
);
INSERT INTO ID_Numbers (ID_Number)
VALUES ('@@id_number@@');
-- rest of script is a simple left join of the above created table with the BQ table containing the data for each ID
這對于單個 ID 號同樣適用,但傳入多個 VALUES(在本例中為 ID 號)將需要('@@id_number@@')每個唯一的 ID。我還沒有嘗試過的一件事 - 為每個唯一 ID 分配一個變數并將每個 ID 作為新 VALUE 傳入。我不確定這種技術是否有效。
- 我嘗試過的第三種技術是在函式中包含完整的 SQL 查詢,而不是呼叫 .sql 腳本。ID 號串列作為元組傳入,查詢如下:
id_nums = tuple(id_number)
query = ("""SELECT * FROM `data_table`
WHERE ID_NUM IN{}""").format(id_nums)
這種技術也不起作用,因為我收到以下錯誤:
AttributeError: 'QueryJob' object has no attribute 'format'. 我試圖調查這個錯誤,但我找不到任何可以有效幫助我的東西。
最后,我要指出,到目前為止,提出相同或類似問題的帖子都沒有解決我的問題。
我正在尋找任何和所有建議,以便我可以成功地將包含多個 ID 號的變數傳遞到最終呼叫并運行 BQ 查詢的函式中。
uj5u.com熱心網友回復:
你應該能夠用*args得到id_numbers的序列f-strings,并str.join()構建SQL查詢:
class MyClass:
def state_data(self, state, *id_numbers):
print(f"{state=}")
query = f"""
SELECT * FROM `data_table`
WHERE ID_NUM IN ({", ".join(str(id_number) for id_number in id_numbers)})
"""
print(query)
my_class = MyClass()
my_class.state_data("some state", 123)
my_class.state_data("some more state", 123, 124)
在我的機器上,這會列印:
? sql python main.py
state='some state'
SELECT * FROM `data_table`
WHERE ID_NUM IN (123)
state='some more state'
SELECT * FROM `data_table`
WHERE ID_NUM IN (123, 124)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/363903.html
