Habilita la ejecución de múltiples sentencias mientras se ejecuta vía sqlalchemy

Tengo un objeto DDL ( create_function_foo ) que contiene una statement de función create. En primera línea pongo DROP FUNCTION IF EXISTS foo; pero engine.execute(create_function_foo) devuelve:

 sqlalchemy.exc.InterfaceError: (InterfaceError) Use multi=True when executing multiple statements 

create_engine multi=True como parámetro para create_engine , engine.execute_options y engine.execute pero no funciona.

NOTA : engine si mi instancia de create_engine

NOTA : Estoy usando python 3.2 + mysql.connector 1.0.12 + sqlalchemy 0.8.2

 create_function_foo = DDL("""\ DROP FUNCTION IF EXISTS foo; CREATE FUNCTION `foo`( SID INT ) RETURNS double READS SQL DATA BEGIN ... END """) 

¿Dónde debería ponerlo?

multi=True es un requisito para el conector MySql. No puede establecer este indicador pasándolo a los métodos SQLAlchemy. Hacer esto:

 conn = session.connection().connection cursor = conn.cursor() # get mysql db-api cursor cursor.execute(sql, multi=True) 

Más información aquí: http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg30129.html

Hay algunos casos en los que SQLAlchemy no proporciona una forma genérica para acceder a algunas funciones DBAPI , como tratar con conjuntos de resultados múltiples. En estos casos, debe tratar directamente con la conexión DBAPI sin procesar.

De la documentación de SQLAlchemy :

 connection = engine.raw_connection() try: cursor = connection.cursor() cursor.execute("select * from table1; select * from table2") results_one = cursor.fetchall() cursor.nextset() results_two = cursor.fetchall() cursor.close() finally: connection.close() 

También puede hacer lo mismo usando el conector mysql como se ve aquí:

 operation = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2' for result in cursor.execute(operation, multi=True): if result.with_rows: print("Rows produced by statement '{}':".format( result.statement)) print(result.fetchall()) else: print("Number of rows affected by statement '{}': {}".format( result.statement, result.rowcount))