SQLAlchemy Core metadata.create_all()尝试在Python进程外创建表

时间:2015-04-27 17:00:14

标签: python sqlalchemy

使用SQLAlchemy 0.7.8和Python 2.7(也在Python 2.6中观察到)。

我有一个脚本,它将从数据库读取表X并创建表X1。

我的数据库有表A,B,C,D。我启动了四个完全独立的进程来创建表A1,B1,C1,D1。

我观察的是一种竞争条件,其中B进程中的metadata.create_all()也试图创建表A1并且因为A1已经由进程A创建而失败。使用checkfirst =显式为真(无论如何都是默认值)没有帮助。

我不明白为什么进程B的metadata.create_all()会尝试创建非B表。它甚至知道其他进程正在其他表上工作?我可以在不使用create_all()的情况下探索做我需要的方法,但这看起来很奇怪。它在Postgres 9.2服务器上,如果这有任何区别。

1 个答案:

答案 0 :(得分:0)

您是否有多个模型共享相同的元数据?很可能(这是默认方式)。

引用the docs

  

创建存储在此元数据中的所有表。

因此,脚本中仅存在所有表' description 会使create_all创建这些表。如果您知道要创建哪个表,则可以在该表上调用create(),或将模型列表传递给create_all(),并让它对任何正确的创建顺序进行排序。