Как динамически удалять кавычки из строки словаря - PullRequest
2 голосов
/ 30 января 2020

У меня есть словарь вроде: d = {'table': 'db_schema.foo', 'column': 'bar'}. Я хочу передать этот словарь после удаления кавычек из всех значений. Поэтому я хочу получить {'table': db_schema.foo, 'column': bar} динамически.

Подробности:

Я пытаюсь передать динамический запрос c в exasol после подключения. Я использую Pyexasol здесь и пытаюсь execute(). Я пытаюсь выполнить простой запрос, например:

SELECT * 
FROM db_schema.foo
WHERE bar >= 0

Если я предоставлю словарь d, то получаемый запрос будет:

SELECT * 
FROM 'db_schema.foo'
WHERE 'bar' >= 0

и приведет к ошибке. Поэтому я хочу удалить цитату из всех значений. Я пытался {k:v.strip("\'") for k, v in d.items()} et c. но пока не удалось.

Запрошенный код:

foo_query = '''select *
                from {app_table}
                where {col} >= '2020-01-01'
                limit 10;'''
foo_param={'app_table': 'src.application',
             'col': 'createdat'}
foo_results = exasol.runQueryExaParams(query=foo_query, query_param=foo_param)
foo_results1 = exasol.runQueryExaParams(query=foo_query, query_param={k:v.strip("\'") for k, v in foo_param.items()})

, где exasol - это класс, построенный на pyexasol с только параметрами соединения. Соответствующий метод из класса:

    def runQueryExaParams(self, query, query_param):
        self.conn = pyexasol.connect(
            dsn=self.__dsn, user=self.__user, password=self.__password, encryption=True)
        res = self.conn.export_to_pandas(query, query_param)
        self.conn.close()
        res.columns = res.columns.str.lower()
        return res

В обоих случаях я получаю одну и ту же ошибку:

pyexasol.exceptions.ExaQueryError: 
(
    message     =>  syntax error, unexpected simple_string_literal [line 3, column 22] (Session: )
    dsn         =>  
    user        =>  
    schema      =>  
    code        =>  42000
    session_id  =>  
    query       =>  EXPORT (
select *
                from 'src.application'
                where 'createdat' >= '2020-01-01'
                limit 10
) INTO CSV
AT 'https://1.2.3.4' FILE '000.csv'
WITH COLUMN NAMES
)

1 Ответ

2 голосов
/ 30 января 2020

Как я уже сказал в своем комментарии, вам нужно прочитать SQL ФОРМАТИРОВАНИЕ .

С учетом вышесказанного вам необходимо изменить код так, чтобы он был примерно таким:

query = '''
    SELECT *
    FROM {app_table!q}
    WHERE {col!i} >= '2020-01-01'
    LIMIT 10;
'''

query_param = {
    'app_table': ('src', 'application'),
    'col': 'createdat'
}

results = exasol.runQueryExaParams(
    query=query,
    query_param=query_param
)

Как указывается в документации, приведенный выше код приведет к следующему запросу:

SELECT *
FROM "src"."application"
WHERE createdat >= '2020-01-01'
LIMIT 10;

Надеюсь, это поможет.

...