Большие надежды SQLAlchemy не заключает имена столбцов в нижний регистр

Я пытаюсь использовать SQLAlchemy и Great Expectations для проверки качества данных наборов данных, хранящихся в БД Snowflake. Набор данных называется candidates, а интересующий столбец называется first_name.

Однако, когда я бегу

sql_dataset = great_expectations.dataset.SqlAlchemyDataset(table_name="candidates", engine=engine, schema=creds["schema"])
sql_dataset.expect_column_values_to_be_in_set("first_name", ['Gather', 'Male'])

Я получаю:

ProgrammingError: (snowflake.connector.errors.ProgrammingError) 002003 (42S02): SQL compilation error:
Object 'KEBOOLA_274.WORKSPACE_48777448.CANDIDATES' does not exist or not authorized.
[SQL: SELECT count(*) AS element_count, sum(CASE WHEN (first_name IS NULL) THEN %(param_1)s ELSE %(param_2)s END) AS null_count, sum(CASE WHEN (first_name NOT IN (%(first_name_1)s, %(first_name_2)s) AND first_name IS NOT NULL) THEN %(param_3)s ELSE %(param_4)s END) AS unexpected_count 
FROM "WORKSPACE_48777448".candidates]
[parameters: {'param_1': 1, 'param_2': 0, 'first_name_1': 'Gather', 'first_name_2': 'Male', 'param_3': 1, 'param_4': 0}]
(Background on this error at: http://sqlalche.me/e/13/f405)

Проблема в том, что имя таблицы не заключено в двойные кавычки, поэтому Snowflake ищет CANDIDATES вместо candidates. Та же проблема возникнет с именем столбца, если таблица будет найдена.

я тестировал

sql_dataset = great_expectations.dataset.SqlAlchemyDataset(table_name="\"candidates\"",
                                                           engine=engine,
                                                           schema=creds["schema"])

bu Затем Snowflake ищет таблицу с именем KEBOOLA_274.WORKSPACE_48777448.""candidates"".

Я знаю, что SQLAlchemy по умолчанию считает имена объектов в нижнем регистре нечувствительными к регистру, поэтому не заключает имена. Пожалуйста, есть ли способ обойти это?


person RadRuss    schedule 10.09.2020    source источник
comment
Когда вы создали таблицу candidates, вы создали ее с " вокруг нее? Если вы этого не сделали, то не должно быть никаких проблем. Единственное, что заключено в кавычки на основе ваших журналов, это схема ...FROM "WORKSPACE_48777448".candidates. Таким образом, если при создании схемы вы заключили ее в " И это было строчными буквами, вам нужно будет сделать схему в нижнем регистре в файле конфигурации.   -  person Simon D    schedule 11.09.2020
comment
Я создал его с именем в нижнем регистре — фактическое имя таблицы — candidates, поэтому мне нужно отправить запрос, который выглядит как select * from "candidates".   -  person RadRuss    schedule 11.09.2020
comment
Переименуйте свою таблицу в Snowflake в CANDIDATES или просто без кавычек, и все готово. Именно по этой причине в Snowflake не рекомендуется заключать имена таблиц в кавычки.   -  person Mike Walton    schedule 13.09.2020
comment
К сожалению, это не вариант в моем случае использования, я работаю над расширением существующего программного обеспечения, и его настройка потребует значительных изменений. И даже если бы мне удалось это сделать, та же проблема возникла бы с именем столбца (запрос был бы проанализирован как select col_name from TABLE_NAME, и снежинка искала бы версию имени столбца в верхнем регистре).   -  person RadRuss    schedule 14.09.2020


Ответы (2)


Я работаю в Superconductive как разработчик Great Expectations. Несколько недель назад я отправил исправление! Теперь вы можете указать свойство use_quoted_name в вашем batch_kwargs.. Если для него установлено значение True, оно будет обрабатывать вашу таблицу и имена столбцов как чувствительные к регистру, поэтому у вас не должно возникнуть проблем с доступом к именам таблиц в нижнем регистре, хотя вам также необходимо убедиться, что регистр других имен таблиц и столбцов указаны надлежащим образом.

person Tal Gluck    schedule 09.12.2020

Как предложил Майк Уолтон в комментариях, решение заключалось в том, чтобы перед использованием пакета great_expectations заглавные буквы для всех имен таблиц.

person RadRuss    schedule 16.09.2020