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))