使用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服务器上,如果这有任何区别。
答案 0 :(得分:0)
您是否有多个模型共享相同的元数据?很可能(这是默认方式)。
引用the docs:
创建存储在此元数据中的所有表。
因此,脚本中仅存在所有表' description 会使create_all
创建这些表。如果您知道要创建哪个表,则可以在该表上调用create()
,或将模型列表传递给create_all()
,并让它对任何正确的创建顺序进行排序。