Я (мы) используем 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
, так что я предполагаю, что это какая-то вещь, ориентированная на диалект, но я 'Я не уверен, что это лучший способ сделать это.
Есть идеи?