sqlalchemy:使用参数绑定执行原始sql

Max*_* L. 34 python sqlalchemy database-migration flask-sqlalchemy alembic

我正在尝试使用带有SQLALchemy的参数(在一个alembic脚本中)运行这个简单的原始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)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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)" []
Run Code Online (Sandbox Code Playgroud)

解决方案:

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)
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 44

您需要获取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
)
Run Code Online (Sandbox Code Playgroud)

另请参阅:如何在SQLAlchemy-flask应用程序中执行原始SQL.

  • 解决方案几乎是正确的.它仍然会给出"一个意外的关键字参数"错误.将'**t'改为't',它有效. (5认同)
  • @AneilMallavarapu请注意,[Session](http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.execute)中的`execute(..)`与[连接](http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.Connection.execute) 或引擎中的一个。 (3认同)
  • 我尝试了这个(传递 **t 作为参数)并得到: TypeError:execute() gets an Unexpected keywords argument 'code' (2认同)