sqlalchemy: выполнение необработанного sql с привязкой параметров

Я пытаюсь запустить этот простой необработанный оператор sql с параметрами с помощью SQLALchemy (внутри сценария перегонного куба):

from alembic import op

t = {"code": "123", "description": "one two three"}

op.execute("insert into field_tags (id, field_id, code, description) "+
               "values (1,'zasz', :code ,:description')", t)

И я получаю следующую ошибку:

sqlalchemy.exc.StatementError: A value is required for bind parameter 
  'description' (original cause: InvalidRequestError: A value is required for 
  bind parameter 'description') "insert into field_tags (id, field_id, code, 
  description) values (1, 'math', 
  %(code)s ,%(description)s)" []

Решение:

t = {"code": "123", "description": "one two three"}
from sqlalchemy.sql import text

op.get_bind().execute(text("insert into field_tags (id, field_id, code, description) "+
               "values (1,'zasz', :code ,:description')"), **t)

person Max L.    schedule 21.04.2014    source источник


Ответы (1)


Вам нужно получить объект connection, вызвать execute() и передать параметры запроса в качестве аргументов ключевого слова:

from alembic import op
from sqlalchemy.sql import text

conn = op.get_bind()
conn.execute(
    text(
        """
            insert into field_tags 
            (id, field_id, code, description) 
            values 
            (1, 'zasz', :code , :description)
        """
    ), 
    **t
)

Также см.: Как выполнить необработанный SQL в приложении SQLAlchemy-flask< /а>.

person alecxe    schedule 21.04.2014
comment
Я попробовал это (передав ** t в качестве аргумента) и получил: TypeError: execute () получил неожиданный аргумент ключевого слова «код» - person Max L.; 22.04.2014
comment
@MaxL., мой плохой, не могли бы вы попробовать код из обновленного ответа? Идея состоит в том, чтобы получить объект подключения и вызвать для него execute(). - person alecxe; 22.04.2014
comment
Спасибо, это помогло, мне пришлось внести еще одно изменение: запрос должен быть обернут текстовой функцией (из текста импорта sqlalchemy.sql), дал +1 к вашему ответу, если вы добавите обертку text(), ( как в моем обновлении выше) я приму это как окончательный ответ. - person Max L.; 22.04.2014
comment
Решение почти правильное. Он по-прежнему выдает ошибку «получил неожиданный аргумент ключевого слова». Измените «** t» на «t», и это сработает. - person Aneil Mallavarapu; 17.11.2014
comment
@AneilMallavarapu Обратите внимание, что execute(..) из Session отличается от значения в Соединение или Двигатель. - person André C. Andersen; 29.11.2017