29

I (bir alembic komut içinde) sqlalchemy ile parametrelerle bu basit ham sql deyimini çalıştırmak çalışıyorum:sqlalchemy: parametre ciltleri ile ham sql yürütme

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) 

Ve aşağıdaki hatayı alıyorum:

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

çözeltisi:

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) 

cevap

32

Sen connection nesneyi almak üzerine execute() çağrı ve anahtar kelime argümanlar sorgu parametrelerini geçmesi gerekiyor:

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 
) 

Ayrıca bakınız: How to execute raw SQL in SQLAlchemy-flask app.

+0

Bunu denedim (argüman olarak ** t geçişi) ve şunu elde ettim: TypeError: execute() beklenmedik bir anahtar kelime argümanı var 'code' –

+0

@MaxL., Kötüyüm, güncellenmiş cevaptan kodu deneyebilir misiniz? Fikir, bağlantı nesnesini almak ve üzerinde 'execute()' işlevini çağırmaktır. – alecxe

+0

Teşekkürler, bu yardımcı oldu, yapmak zorunda başka bir değişiklik vardı: sorgu metin fonksiyonu (sqlalchemy.sql ithalat metninden) tarafından sarılmış olması gerekir, cevabınıza + 1 verdi, metin() wrapp eklemek, (Yukarıdaki güncellememde olduğu gibi), kesin cevap olarak kabul edeceğim. –