alembic及获取最后插入值

4 投票
1 回答
4208 浏览
提问于 2025-04-17 19:51

我正在使用alembic来管理我的数据库结构。

在我添加一个使用整数作为主键的表之后,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')})
        )

1 个回答

5

首先,要让某一列自动递增,你需要修改表的结构定义,让主键列使用序列: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)
)

接下来,关于如何获取主键id:

op.executeop.bulk_insert 这两个操作不会返回任何结果。但是,你可以使用这些操作时所用的连接。

在执行完 bulk_insertexecute(table.update ...) 后,你可以在同一个上下文中运行查询,来获取你感兴趣记录的主键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条件中指定合适的过滤条件,以确保你唯一地识别出最近更改的记录。

这里有一个 类似功能的示例,不过它里面的查询是硬编码的。

撰写回答