Я использую коннектор Python Snowflake для извлечения данных из таблиц в Snowflake. Вот моя файловая структура:
sql
a.sql
b.sql
c.sql
configurations.py
data_extract.py
main.py
Здесь папка sql содержит все мои запросы sql в файлах .sql. Я помещаю эти файлы sql отдельно, потому что каждый из них состоит из длинных строк и выглядит беспорядочно, если я помещаю их в файлы python. configuration.py содержит параметры даты и времени, которые я хочу изменять каждый раз при запуске кода. Это выглядит так:
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;
Я использую a.sql в своем коде на Python следующим образом:
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
Проблема в том, что я хочу, чтобы START_PICKUP_DATE и END_PICKUP_DATE в файле a.sql были синхронизированы и равны START_TIME и END_TIME в файле configurations.py, чтобы мне нужно было только изменить START_TIME и END_TIME в configurations.py и извлечь данные в другой период времени. используя a.sql в Snowflake.
Я довольно долго искал решения в Интернете, но до сих пор не могу найти хорошее решение, специфичное для моей проблемы. Большое спасибо всем, кто может дать подсказку!