Как получить with_hints () для компиляции в query.statement - PullRequest
0 голосов
/ 11 июня 2019

Я (мы) используем sqlalchemy (1.3.3) + mysql-connector (2.1.6) в нашем проекте, и вчера я хотел выполнить EXPLAIN через sqlalchemy, и написал это

def explain(query: Query) -> Query:
    print('========= SQL EXPLAIN START =========')
    _stmt = query.statement
    params = _stmt.compile(dialect=mysql.dialect()).params
    print('--------- SQL QUERY ---------')
    print('Query: ', _stmt)
    print('--------- SQL PARAMS ---------')
    print('Params: ', params)
    s: Session = query.session
    result = s.execute('EXPLAIN {}'.format(_stmt), params)
    print('--------- SQL EXPLAIN RESULT ---------')
    df = pd.DataFrame(
        list(map(functools.partial(map, str), result)),
        columns=(
            'id',
            'type',
            'table',
            'type',
            'possible',
            'used',
            'len',
            'ref',
            'rows',
            'Extra'
        )
    )
    pd.set_option('max_colwidth', 20)
    print(df)
    print('========= SQL EXPLAIN END =========')

    return query


Это работает как талисман, но когда я увидел результаты и попытался намекнуть запрос, который я использовал для тестирования, добавив query.with_hints(SomeModel, 'USE INDEX ( __some_idx__ )'), он не существовал в _stmt и, следовательно, не обнаружился в EXPLAIN SQL, которыйЯ написал.

Часть USE INDEX на самом деле существует в _stmt.compile(dialect=mysql.dialect()), но затем все параметры заменяются на% s, когда params является диктом и не работает хорошо вместе.

Когда я избавился от dialect = mysql.dialect (), я получил хорошее утверждение, дружественное к параметрам, но снова потерял USE INDEX, так что я предполагаю, что это какая-то вещь, ориентированная на диалект, но я 'Я не уверен, что это лучший способ сделать это.

Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...