我在多租户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。
答案 0 :(得分:3)
(从评论中复制)
假设 sess
是会话,您可以改为sess.execute(CreateTable(tenantX_tableY))
。
编辑:CreateTable
只是调用table.create()
时所做的事情之一。请改用table.create(sess.connection())
。