Python Sqlalchemy core,从元组中插入多行,而不是dict

Python Sqlalchemy core,从元组中插入多行,而不是dict,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我有2D元组中的数据(或者说来自Numpy表),需要将其插入SQL表中。将Sqlalchemy Core与SQLite一起使用,如何高效、简单地将这些数据插入表中 例如从@eclaird engine = sa.create_engine('sqlite://', echo=True) metadata = sa.MetaData() widgets_table = sa.Table('widgets', metadata, sa.Column('id', sa.Integer, pr

我有2D元组中的数据(或者说来自Numpy表),需要将其插入SQL表中。将Sqlalchemy Core与SQLite一起使用,如何高效、简单地将这些数据插入表中

例如从@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),
    ]
到目前为止,我在文档中;所以我有

engine.execute(widgets_table.insert().values((None, "Test", True, 3)))
这很有效。但是我想一次插入许多行,例如

engine.execute(widgets_table.insert().values(((None, "Test", True, 3), (None, "Test", True, 3))))
但随后是错误

具有当前数据库版本设置的“sqlite”方言不支持就地多行插入

也试过了,

insert = widgets_table.insert()

engine.execute(insert, [
                    (None, "Test", True, 3), 
                    (None, "Test", True, 3) 
                    ])
错误

AttributeError:“元组”对象没有属性“键”


作为一个最近转换为SQLalch的人,我在这里有点不知所措。

您缺少一些有关设置的详细信息,所以我编了一些东西。插入元组很困难,除非您也要插入表的主键,那么为什么不在插入之前从数据创建一个字典呢

这应该适用于SQLAlchemy 0.7.6及更高版本:

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

谢谢,但我希望避免创建一个临时dict-我希望避免在代码中记住所有的列名。当数据已经存在于2D元组中时,创建这个dict不是多余的吗?但是,假设我只知道列的数据类型和顺序,有没有一种简单的方法可以按位置插入它?您需要将字符串插入语句与参数“”结合使用,这将更直接地发送到pysqlite DBAPI。SQLA insert()构造在内部总是将事物视为字典。如果性能是目标,则需要直接访问DBAPI。如果是可移植性,那么只需使用类似于dict(zip((表c中c的c.key)的函数,行))创建字典。编辑我的答案以使用原始SQL,使用多行插入。好的,如果是这样的话,那就是生活。感谢您提供的信息!@eclaird-感谢您提供此解决方案。我尝试使用您的解决方案,因为我有类似的问题,但我遇到了一个错误。我在此处创建了一篇帖子().非常感谢您的指导。谢谢。