alembic:在迁移中使用子查询进行更新语句

3 投票
1 回答
893 浏览
提问于 2025-04-17 14:25

我正在使用alembic来管理我的数据库迁移。在我当前的迁移中,我还需要根据一个SELECT语句来填充一个列(基本上是从另一个表复制一个列)。

用普通的SQL我可以这样做:

UPDATE foo_table
SET bar_id=
    (SELECT bar_table.id FROM bar_table
        WHERE bar_table.foo_id = foo_table.id); 

但是我不知道怎么用alembic来实现这个:

execute(
    foo_table.update().\
        values({
            u'bar_id': ???
        })
) 

我尝试用普通的SQLAlchemy表达式来替代'???':

select([bar_table.columns['id']], 
       bar_table.columns[u'foo_id'] == foo_table.columns[u'id'])

但这只会生成错误的SQL,并在执行时出现编程错误:

'UPDATE foo_table SET ' {}

1 个回答

2

其实它的工作方式正如我上面描述的那样。

我的问题是,在我的alembic脚本中,'foo_table'的表定义里没有包含'bar_id'这一列,所以SQLAlchemy没有用这个来生成SQL语句...

撰写回答