Sqlalchemy core, inserta varias filas desde una tupla en lugar de dict

Tengo datos en una tupla 2D (o digamos que viene de una tabla Numpy) y necesito insertarla en una tabla SQL. Al usar Sqlalchemy Core con SQLite, ¿cómo puedo insertar de manera eficiente y sencilla estos datos en mi tabla?

Toma ie de @eclaird;

engine = sa.create_engine('sqlite://', echo=True) metadata = sa.MetaData() widgets_table = sa.Table('widgets', metadata, sa.Column('id', sa.Integer, primary_key=True), sa.Column('bar', sa.String(50)), sa.Column('biz', sa.Boolean), sa.Column('baz', sa.Integer), ) metadata.create_all(engine) # Assuming this is the data where None holds place for primary key my_data = [ (None, "Test", True, 3), (None, "Test", True, 3), ] 

Hasta ahora estoy en este punto en los documentos; así que tengo;

 engine.execute(widgets_table.insert().values((None, "Test", True, 3))) 

Que funciona Pero quiero insertar muchas filas a la vez como

 engine.execute(widgets_table.insert().values(((None, "Test", True, 3), (None, "Test", True, 3)))) 

Pero entonces el error;

El dialecto ‘sqlite’ con la configuración actual de la versión de la base de datos no admite inserciones de múltiples filas en el lugar.

También lo intenté;

 insert = widgets_table.insert() engine.execute(insert, [ (None, "Test", True, 3), (None, "Test", True, 3) ]) 

Con error

AttributeError: el objeto ‘tuple’ no tiene atributo ‘keys’

Como un reciente converso a SQLalch, estoy un poco perdido aquí.

Te estás perdiendo algunos detalles sobre tu configuración, así que inventé algo. Insertar tuplas es difícil a menos que también esté insertando la clave principal de la tabla, ¿por qué no crear un diccionario a partir de sus datos antes de insertarlos?

Esto debería funcionar con SQLAlchemy 0.7.6 y versiones posteriores:

 import sqlalchemy as sa engine = sa.create_engine('sqlite://', echo=True) metadata = sa.MetaData() widgets_table = sa.Table('widgets', metadata, sa.Column('id', sa.Integer, primary_key=True), sa.Column('foo', sa.String(50)), sa.Column('bar', sa.String(50)), sa.Column('biz', sa.Boolean), sa.Column('baz', sa.Integer), ) metadata.create_all(engine) # Assuming this is your data values = [ (None, "Test", True, 3), (None, "Test", True, 3), ] with engine.connect() as connection: with connection.begin() as transaction: try: markers = ','.join('?' * len(values[0])) ins = 'INSERT INTO {tablename} VALUES ({markers})' ins = ins.format(tablename=widgets_table.name, markers=markers) connection.execute(ins, values) except: transaction.rollback() raise else: transaction.commit()