Как отобразить окончательный текст SQL с кортежами в связанных параметрах, используя sqlalchemy - PullRequest
0 голосов
/ 12 января 2019

В целях отладки я хочу отобразить sql, который фактически будет выполнен.

У меня есть простой пример запроса:

SELECT (id, title) 
  FROM some_table AS t
  WHERE 
    t.id IN :id_sequence
  LIMIT :count

Мой питон выглядит примерно так:

def resolve(query, **params):
    """Returns the resolved query using the input params

    Example:
        >>> query = "SELECT (id, title) FROM table AS t WHERE t.id IN :id_sequence LIMIT :count"
        >>> resolve(query, id_sequence=('1', '2'), count=5)
        SELECT (id, title) FROM table AS t WHERE t.id IN ('1', '2') LIMIT 5

    Args:
        query: the text to query
        params: the map of bound parameters and their values

    Returns:
        fully resolved text
    """
    import sqlalchemy
    sql = sqlalchemy.text(query)
    # Capture only the parameters that are actually in the query
    bound_parameters = sql.params(**params).compile().params
    # Then bind only those captured parameters
    bound_sql = sql.bindparams(**bound_params)
    compiled_sql = bound_sql.compile(compile_kwargs={"literal_binds": True})
    return str(compiled_sql)

Для следующих значений параметров:

{'id_sequence': ('1', '2'), 'limit': 5}

Используя sql выше, я ожидаю, что в итоге получу:

SELECT (id, title) 
  FROM some_table AS t
  WHERE 
    t.id IN ('1', '2')
  LIMIT 5

На самом деле я вижу:

SELECT (id, title) 
  FROM some_table AS t
  WHERE 
    t.id IN NULL
  LIMIT 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...