sqlalchemy:执行带参数绑定的原始SQL

55 投票
1 回答
60045 浏览
提问于 2025-04-18 03:39

我正在尝试在一个 alembic 脚本中使用 SQLALchemy 运行这个简单的原始 SQL 语句,并且带有参数:

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)

1 个回答

78

你需要获取一个 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
)

另外可以参考: 如何在SQLAlchemy-flask应用中执行原始SQL

撰写回答