Я использую Sqlalchemy 1.3 для подключения к базе данных PostgreSQL 9.6 (через Psycopg).
У меня есть очень, очень необработанная строка Sql, отформатированная с использованием синтаксиса Psycopg2 , которую я не могу изменить из-за некоторых унаследованных проблем:
statement_str = SELECT * FROM users WHERE user_id=%(user_id)s
Обратите внимание на %(user_id)s
Я могу с радостью выполнить это, используя соединение sqlalchemy, просто выполнив:
connection = sqlalch_engine.connect()
rows = conn.execute(statement_str, user_id=self.user_id)
И это прекрасно работает. Я получил мой пользователь, и все хорошо и хорошо.
Теперь для целей отладки я бы хотел получить фактический запрос с аргументом %(user_id)s
, расширенным до фактического значения. Например: если user_id = "foo"
, тогда получите SELECT * FROM users WHERE user_id = 'foo'
Я видел множество примеров использования sqlalchemy.text(...)
для создания оператора, а затем получения скомпилированной версии. У меня есть это благодаря другим ответам, таким как этот или этот смог выдать приличный str
, когда у меня есть запрос SqlAlchemy.
Однако в данном конкретном случае, поскольку я использую более специфичный для курсора синтаксис %(user_id)
, я не могу этого сделать. Если я попытаюсь:
text(statement_str).bindparams(user_id="foo")
Я получаю:
This text() construct doesn't define a bound parameter named 'user_id'
Так что я думаю, что то, что я ищу, будет примерно таким:
conn.compile(statement_str, user_id=self.user_id)
Но я не смог этого получить.