Ask*_*ken 4 python sqlalchemy alembic
我正在使用 alembic 来管理我的数据库结构。
添加使用 id 作为整数和主键的表后,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'}
])
Run Code Online (Sandbox Code Playgroud)
我知道我可以进行更新,但是如何使用类似下面的内容进行选择?
op.execute(
srv_feed_return_type.update().\
where(srv_feed_return_type.c.name==op.inline_literal('dataset')).\
values({'name':op.inline_literal('somethingelse')})
)
Run Code Online (Sandbox Code Playgroud)
首先要拥有自动增量列,您需要修改表架构定义以为主键列传递 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)
)
Run Code Online (Sandbox Code Playgroud)
现在关于如何获得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"""
Run Code Online (Sandbox Code Playgroud)
您需要在 where 子句中指定适当的过滤器,以确保您以独特的方式识别最近更改的记录。
这是类似功能的一些示例,但它具有硬编码的选择查询
| 归档时间: |
|
| 查看次数: |
2668 次 |
| 最近记录: |