4

データベース構造の管理に alembic を使用しています。

id を整数として使用し、主キーを使用してテーブルを追加すると、id 列は autoincrement-column になります。アップグレード スクリプトでデータをクエリして、正しい ID を確実に取得するにはどうすればよいですか (この特定のケースでは ID が 1 であることはわかっています)。

私は方法を知っています

#creating the table
op.create_table(
    'srv_feed_return_type',
    sa.Column('id', sa.Integer, primary_key=True),
    sa.Column('name', sa.String(50), nullable=False),
    sa.Column('created', sa.DateTime, server_default=func.now(), nullable=False),
    sa.Column('created_by', sa.String(50), nullable=False),
    sa.Column('last_updated', sa.DateTime, nullable=False),
    sa.Column('last_updated_by', sa.String(50), nullable=False)
)

#table for operations
srv_feed_return_type = table('srv_feed_return_type',
                             column('name'),
                             column('created'),
                             column('created_by'),
                             column('last_updated'),
                             column('last_updated_by'))

#bulk insert
op.bulk_insert(srv_feed_return_type,
               [
                   {'name': 'dataset',
                    'created': datetime.now(), 'created_by': 'Asken',
                    'last_updated': datetime.now(), 'last_updated_by': 'Asken'}
               ])

更新できることはわかっていますが、以下のようなものを使用して選択するにはどうすればよいですか?

op.execute(
    srv_feed_return_type.update().\
        where(srv_feed_return_type.c.name==op.inline_literal('dataset')).\
        values({'name':op.inline_literal('somethingelse')})
        )
4

1 に答える 1

5

最初に自動インクリメント列を作成するには、主キー列に Sequence が渡されるようにテーブル スキーマ定義を変更する必要があります。sa.Column('id', sa.Integer, Sequence('srv_feed_r_t_seq'),primary_key=True),

#creating the table
op.create_table(
    'srv_feed_return_type',
    sa.Column('id', sa.Integer, Sequence('srv_feed_r_t_seq'),primary_key=True),
    sa.Column('name', sa.String(50), nullable=False),
    sa.Column('created', sa.DateTime, server_default=func.now(), nullable=False),
    sa.Column('created_by', sa.String(50), nullable=False),
    sa.Column('last_updated', sa.DateTime, nullable=False),
    sa.Column('last_updated_by', sa.String(50), nullable=False)
)

PK id の取得方法について:

op.execute結果は返されop.bulk_insertません。ただし、これらの操作に使用される同じ接続を取得できます。

実行後、bulk_insertまたはexecute(table.update ...)同じコンテキストで選択クエリを実行して、対象のレコードの PK ID を取得できます。

connection = op.get_bind()
r = connection.execute(srv_feed_return_type.select().where(...))
for row in r:
    pk_id = r['id']
    """or something more sophisticated"""

最近変更したレコードを一意の方法で識別できるようにするには、where 句で適切なフィルターを指定する必要があります。

同様の機能の例を次に示しますが、選択クエリがハードコーディングされています

于 2013-03-21T18:37:06.117 に答える