如何在Postgres的事务中使用Sqlalchemy创建表?

时间:2013-04-02 21:38:21

标签: python postgresql sqlalchemy ddl flask-sqlalchemy

我在多租户Flask应用程序中使用Sqlalchemy,并且需要在添加新租户时动态创建表。我一直在使用Table.create在新的Postgres模式中创建单独的表(以及search_path修改),这很有效。

我发现的限制是Table.create方法阻止当前事务中有任何待处理的事情。我必须在.create调用之前提交事务,否则它将阻塞。它似乎没有在Sqlalchemy中被阻止,因为你不能Ctrl-C它。你必须杀死这个过程。所以,我假设它在Postgres中更进一步。

我在其他答案中读到CREATE TABLE是事务性的并且可以回滚,因此我认为这应该可行。我已尝试使用当前引擎启动一个新事务并将其用于表创建(与当前Flask相比),但这也没有帮助。

有没有人知道如何在没有早期提交的情况下使其工作(并冒险部分悬空数据)?

这是Python 2.7,Postgres 9.1和Sqlalchemy 0.8.0b2。

1 个答案:

答案 0 :(得分:3)

(从评论中复制)

假设sess是会话,您可以改为sess.execute(CreateTable(tenantX_tableY))

编辑:CreateTable只是调用table.create()时所做的事情之一。请改用table.create(sess.connection())