簡體   English   中英

如何將config.py中的Python參數傳遞到.sql文件?

[英]How can I pass a Python parameter in config.py to .sql file?

我正在使用Python Snowflake連接器從Snowflake中的表中提取數據。 這是我的文件結構:

sql
   a.sql
   b.sql
   c.sql
configurations.py
data_extract.py
main.py

此處的sql文件夾在.sql文件中包含我所有的sql查詢。 我將這些sql文件分開放置,因為它們每個都是很長的線,如果將它們放到python文件中,看起來會很凌亂。 configuration.py包含我每次運行代碼時都要更改的datetime參數。 看起來像這樣:

START_TIME = '2018-10-01 00:00:00'
END_TIME = '2019-04-01 00:00:00'

我想將這些參數添加到.sql文件中。 例如, a.sql包含以下內容:

DECLARE
  @START_PICKUP_DATE DATE,
  @END_PICKUP_DATE DATE,

SET
  @START_PICKUP_DATE = '2018-10-01'

SET
  @END_PICKUP_DATE = '2019-04-01'

select supplier_confirmation_id, pickup_datetime, dropoff_datetime, pickup_station_distance
from SANDBOX.ZQIAN.V_PDL
where pickup_datetime >= START_PICKUP_DATE and pickup_datetime < END_PICKUP_DATE
      and supplier_confirmation_id is not null;

我通過以下方式在python代碼中使用a.sql

def executeSQLScriptsFromFile(filepath):
    # snowflake credentials, replace SECRET with your own
    ctx = snowflake.connector.connect(
        user='S_ANALYTICS_USER',
        account=SECRET_A,
        region='us-east-1',
        warehouse=SECRET_B,
        database=SECRET_C,
        role=SECRET_D,
        password=SECRET_E)

    fd = open(filepath, 'r')
    query = fd.read()
    fd.close()

    cs = ctx.cursor()
    try:
        cur = cs.execute(query)
        df = pd.DataFrame.from_records(iter(cur), columns=[x[0] for x in cur.description])
    finally:
        cs.close()
    ctx.close()

    return df

def extract_data():
    a_sqlpath = os.path.join(os.getcwd(), 'sql\a.sql')
    a_df = executeSQLScriptsFromFile(a_sqlpath)
    return a_df

問題是我想同步a.sql文件中的START_PICKUP_DATE和END_PICKUP_DATE,並使其與configuration.py文件中的START_TIME和END_TIME相等,這樣我只需要更改configuration.py中的START_TIME和END_TIME並使用a提取不同時間范圍內的數據。雪花中的sql。

我一直在網上尋找解決方案很長時間,但仍然找不到適合我問題的好的解決方案。 非常感謝任何可以提供提示的人!

為此,我將獲取您的.sql文件,並將查詢提取到帶有變量格式說明符的三引號python字符串中。 然后將查詢導入到主腳本中,就像導入配置一樣:

sql_queries.py:

sql_a = """
DECLARE
  @START_PICKUP_DATE DATE,
  @END_PICKUP_DATE DATE,

SET
  @START_PICKUP_DATE = {START_TIME}

SET
  @END_PICKUP_DATE = {END_TIME}

select supplier_confirmation_id, pickup_datetime, dropoff_datetime, pickup_station_distance
from SANDBOX.ZQIAN.V_PDL
where pickup_datetime >= START_PICKUP_DATE and pickup_datetime < END_PICKUP_DATE
  and supplier_confirmation_id is not null;
"""

main:
from sql_queries import sql_a

print(sql_a.format(configuration.START_TIME, configuration.END_TIME))

您應該能夠對sql語句進行參數化,以便只需在執行期間傳遞參數即可代替在SQL文件中聲明。

select supplier_confirmation_id, pickup_datetime, dropoff_datetime, pickup_station_distance
from SANDBOX.ZQIAN.V_PDL
where pickup_datetime >= %(START_PICKUP_DATE)s and pickup_datetime < %(END_PICKUP_DATE)s and supplier_confirmation_id is not null;

然后,在調用函數時,只需將參數START_PICKUP_DATEEND_PICKUP_DATE作為參數發送到execute語句。 一種實現方法是從參數名稱到參數值的映射。 (在此示例中,我假設您有一個將獲取參數值的函數)。

cur = cs.execute(query, {'START_PICKUP_DATE':get_value_from_config('start_pickup'), 'END_PICKUP_DATE':get_value_from_config('end_pickup')})

或者您可以按位置傳遞它們

cur = cs.execute(query, [get_value_from_config('start_pickup'), get_value_from_config('end_pickup')])

本質上是

cur = cs.execute(query, ['2018-10-01 00:00:00','2019-04-01 00:00:00'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM