как обрабатывать цитату ('') при импорте даты из внешнего файла в sql в python? - PullRequest
0 голосов
/ 02 августа 2020

У меня есть файл param.yaml с содержимым как

effective_date_raw_from : '2019-08-30'
effective_date_raw_to : '2019-09-02'

, но пока я импортирую его в python script

print(" start : " + str(datetime.datetime.now()))
    with open(r'C:\Users\anil\param.yaml') as file:
        param_list = yaml.load(file, Loader=yaml.FullLoader)
        print(param_list)
        print(param_list['effective_date_raw_from'])
        print(param_list['effective_date_raw_to'])
        print(type(param_list['effective_date_raw_from']))
        print(type(param_list['effective_date_raw_to']))

query_template = """
            select *
            from  transaction
            where effective_date between {{effective_date_raw_from}} and {{effective_date_raw_to}} and rnk_domain = 'RAW'
            """
    j = JinjaSql(param_style='pyformat')
    query, bind_params = j.prepare_query(query_template, param_list)
    print(query)
    print(bind_params)
    df_raw = pd.read_sql(query, conn, params=bind_params)
    print(df_raw) 

, я получаю сообщение об ошибке, например: ( 'HY000', '[HY000] [Cloudera] [ImpalaODBC] (110) Ошибка при выполнении запроса в Impala: [HY000]: AnalysisException: синтаксическая ошибка в строке 4: \ n ... действующая_дата между% (эффективная_дата_расход_from_1). .. \ n ^ \ nОбнаружено:% \ nОжидаемое: CASE, CAST, DEFAULT, EXISTS, FALSE, IF, INTERVAL, NOT, NULL, REPLACE, TRUNCATE, TRUE, IDENTIFIER \ n \ n ПРИЧИНА: Исключение: Синтаксическая ошибка \ n ( 110) (SQLPrepare) '), потому что параметр, который я импортирую

, имеет отсутствующую цитату

''

(хотя они строкового типа), следовательно, запрос возвращает ошибку, есть ли способ ее исправить ..

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Объяснение в сообщении об ошибке:

Обнаружено:%

Ожидается: CASE, CAST, DEFAULT, EXISTS, FALSE, IF, INTERVAL, NOT, NULL, REPLACE , TRUNCATE, TRUE, IDENTIFIER

Это означает, что движок SQL, который вы используете, не поддерживает стиль параметров "pyformat".

Возможно, вы добьетесь большего успеха с:

j = JinjaSql(param_style='qmark')

или

j = JinjaSql(param_style='named')
0 голосов
/ 02 августа 2020

я думаю, вам следует использовать модуль json для преобразования строкового файла

import json
file = json.loads(open(r'C:\Users\anil\param.yaml'))
...