Evite el enlace de parámetros al ejecutar consultas con SQLAlchemy

Estoy usando SQLALchemy para ejecutar consultas en Teradata. Una de las consultas que ejecuto es una statement DDL para reemplazar un procedimiento almacenado:

REPLACE PROCEDURE DEV_MIGRATION_TOOL.UNIT_TEST_NEW_STORED_PROCEDURE() UNIT_TEST_NEW_STORED_PROCEDURE: BEGIN DECLARE V_VAR VARCHAR(50); SELECT 'Hello World!' INTO :V_VAR; END; 

Esta sentencia de SQL se asigna a una query variable y es ejecutada por SQLALchemy con el método de ejecución de sesión:

 def execute_sql_statement(self, query): """Generic method to execute a SQL statement on target environment.""" self.target_environment.db_session.execute(query) self.target_environment.db_session.commit() 

El problema que tengo es que SQLAlchemy asume que la variable :V_VAR es un parámetro que debe suministrarse con un diccionario. Consulte la documentación aquí: http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.execute

 result = session.execute("SELECT * FROM user WHERE id=:param", {"param":5}) 

En la configuración actual, dispara el mensaje de error:

2018-04-18 19: 09: 27,874 – migration_script – INFO – Ejecutar la statement DDL del objeto en el entorno UAT. 2018-04-18 19: 09: 27,875 – migration_script – ERROR – (sqlalchemy.exc.InvalidRequestError) Es necesario un valor para el parámetro de vinculación ‘V_VAR’ [SQL: “() \ rUNIT_TEST_NEW_STORED_PROCEDURE: \ rBEGIN \ r ); \ r SELECCIONE ‘Hello World!’ \ r INTO?; \ rEND; “] [parámetros: [{}]]

¿Sabría una forma de evitar este mensaje de error para que mi statement DDL anterior se ejecute sin error?

Session.execute() interpreta cadenas de SQL simples como si se hubiera pasado en una construcción text() . Debido a eso, tiene que escapar de los dos puntos que no desea interpretar como el inicio de un marcador de posición:

Para las sentencias de SQL en las que se requieren dos puntos verbales, como dentro de una cadena en línea, use una barra invertida para escapar

Consulte: http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.text

Así que su query statement DDL debería ser:

 """ REPLACE PROCEDURE DEV_MIGRATION_TOOL.UNIT_TEST_NEW_STORED_PROCEDURE() UNIT_TEST_NEW_STORED_PROCEDURE: BEGIN DECLARE V_VAR VARCHAR(50); SELECT 'Hello World!' INTO \:V_VAR; END; """