29

Próbuję uruchomić ten prosty surowy instrukcji SQL z parametrami z sqlalchemy (szerokość alembic skryptu):sqlalchemy: wykonywanie surowego sql z powiązaniami parametrów

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) 

I pojawia się następujący błąd:

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)" [] 

rozwiązanie:

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) 

Odpowiedz

32

trzeba uzyskać obiekt connection, zadzwoń execute() na nim i przekazać parametry zapytania jako argumenty słowa kluczowe:

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 
) 

zobacz także: How to execute raw SQL in SQLAlchemy-flask app.

+0

Próbowałem tego (przekazując ** t jako argument) i otrzymałem: TypeError: execute() otrzymało nieoczekiwany argument słowa kluczowego "kod" –

+0

@MaxL., Mój zły, czy mógłbyś spróbować kodu z zaktualizowanej odpowiedzi? Chodzi o to, aby uzyskać obiekt połączenia i wywołać na nim 'execute()'. – alecxe

+0

Dzięki, że pomogło, była jeszcze jedna zmiana, którą musiałem wykonać: zapytanie musi być zawinięte przez funkcję tekstową (z tekstu importu sqlalchemy.sql), dało +1 twojej odpowiedzi, dodano tekst wrapp, (jak w mojej aktualizacji powyżej), zaakceptuję to jako ostateczną odpowiedź. –

Powiązane problemy