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

时间:2013-02-01 10:27:04

标签: python sqlalchemy database-migration alembic

我正在使用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和ProgrammingError:

'UPDATE foo_table SET ' {}

1 个答案:

答案 0 :(得分:2)

实际上它完全按照我的描述工作。

我的问题是我的alembic脚本中'foo_table'的表定义不包含'bar_id'列,因此SQLALchemy没有使用它来生成SQL ...