9

2D タプル (または Numpy テーブルからのデータ) にデータがあり、それを SQL テーブルに挿入する必要があります。SQLite で Sqlalchemy Core を使用して、このデータをテーブルに効率的かつ簡単に挿入するにはどうすればよいですか?

@eclard から ie を取得します。

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: 'tuple' オブジェクトに属性 'keys' がありません

最近SQLalchに改宗したので、ここで少し迷っています。

4

2 に答える 2

3

セットアップに関する詳細が不足しているため、何かを作成しました。テーブルの主キーも挿入しない限り、タプルの挿入は難しいので、挿入する前にデータから辞書を作成してみませんか?

これは 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()
于 2012-12-27T14:28:09.593 に答える